[B]Project Euler # 17


今回は、バグも出ず、すんなり正解が得られたが、
もうちょっとシンプルなソースにならないだろうか・・・


 


/*
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;
}