今回は、バグも出ず、すんなり正解が得られたが、
もうちょっとシンプルなソースにならないだろうか・・・
/*
1 から 5 までの数字を英単語で書けば one, two, three, four, five であり、全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている。
では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば、全部で何文字になるか。
注: 空白文字やハイフンを数えないこと。例えば、342 (three hundred and forty-two) は 23 文字、115 (one hundred and fifteen) は20文字と数える。なお、"and" を使用するのは英国の慣習。
*/
#include<iostream>
using namespace std;
#define NUM 1000
//------------------------------------------------------------------------->
//20以下の文字数
//------------------------------------------------------------------------->
int CountOneNumericChar( int num ){
int ans = 0;
if ( num == 1 ) ans += 3; //one
else if ( num == 2 ) ans += 3; //two
else if ( num == 3 ) ans += 5; //three
else if ( num == 4 ) ans += 4; //four
else if ( num == 5 ) ans += 4; //five
else if ( num == 6 ) ans += 3; //six
else if ( num == 7 ) ans += 5; //seven
else if ( num == 8 ) ans += 5; //eight
else if ( num == 9 ) ans += 4; //nine
else if ( num == 10) ans += 3; //ten
else if ( num == 11) ans += 6; //eleven
else if ( num == 12) ans += 6; //twelve
else if ( num == 13) ans += 8; //thirteen
else if ( num == 14) ans += 8; //fourteen
else if ( num == 15) ans += 7; //fifteen
else if ( num == 16) ans += 7; //sixteen
else if ( num == 17) ans += 9; //seventeen
else if ( num == 18) ans += 8; //eighteen
else if ( num == 19) ans += 8; //nineteen
else if ( num == 20) ans += 6; //twenty
return ans;
}
//------------------------------------------------------------------------->
//2桁の文字数
//------------------------------------------------------------------------->
int CountTwoNumericChar( int num ){
int ans = 0;
int num_e0 , num_e1;
//20以下はマップに基づく
if ( num < 20 ) ans += CountOneNumericChar( num );
else{
//オーダーの分解
num_e0 = num % 10;
num_e1 = num / 10;
//1の位は、マップに基づく
ans += CountOneNumericChar( num_e0 );
//10の位
if( num_e1 == 2 ) ans += 6; //twenty
else if( num_e1 == 3 ) ans += 6; //thirty
else if( num_e1 == 4 ) ans += 5; //forty
else if( num_e1 == 5 ) ans += 5; //fifty
else if( num_e1 == 6 ) ans += 5; //sixty
else if( num_e1 == 7 ) ans += 7; //seventy
else if( num_e1 == 8 ) ans += 6; //eighty
else if( num_e1 == 9 ) ans += 6; //ninety
}//end if
return ans;
}
//------------------------------------------------------------------------->
//3桁の文字数
//------------------------------------------------------------------------->
int CountThreeNumericChar( int num ){
int num_e2;
//10の位、1の位の文字数
int ans = CountTwoNumericChar( num % 100 );
//100の位
if( num / 100 != 0 ){
//ans += 3; //andの文字数
ans += 7;//hundredの文字数
num_e2 = num / 100;
ans += CountOneNumericChar( num_e2 );
}
return ans;
}
int CountFourNumericChar( int num ){
//------------------------------------------------------------------------->
//4桁の文字数
//------------------------------------------------------------------------->
int ans = 0;
//1000の位の計算
int num_e3 = num / 1000;
if ( num_e3 !=0 ){
ans += CountOneNumericChar( num_e3 );
ans += 8;//thousand
}
//100の位以下の計算
ans += CountThreeNumericChar(num % 1000);
if ( num % 100 != 0 && num > 100 ) ans +=3; //andの文字数
return ans;
}
int main( void ){
int ans = 0;
cout<< "i\t" << "count\t" << "sum\n";
for( int i = 1 ; i <= NUM ; i++ ){
ans += CountFourNumericChar( i );
cout<< i << "\t" << CountFourNumericChar( i ) << "\t" << ans <<"\n";
}
cout << "answer is " << ans;
getchar();
return 0;
}