C言語でProject Euler(プロジェクト・オイラー)に挑戦 > スポンサー広告 > C言語でProject Euler 【Problem17】

    C言語でProject Euler(プロジェクト・オイラー)に挑戦 > Project Euler(プロジェクト・オイラー)【Problem16~Problem20】 > C言語でProject Euler 【Problem17】

    スポンサー広告

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    Project Euler(プロジェクト・オイラー)【Problem16~Problem20】

    C言語でProject Euler 【Problem17】

    Project Euler(プロジェクトオイラー)のproblem17
    C言語を使っています。


    /* Problem 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 <stdio.h>
    #include <string.h>
    #include <conio.h>

    int main(void)
    {
        int i, j, k, sum;

        char num1[20][10] =
            {"", "one", "two", "three", "four", "five", "six", "seven","eight", "nine",
            "ten", "eleven", "twelve", "thirteen","fourteen", "fifteen",
            "sixteen", "seventeen", "eighteen", "nineteen"};
        char num10[9][10] = {"", "twenty", "thirty", "forty", "fifty",
            "sixty", "seventy", "eighty", "ninety"};
        char num100[10] = {"hundred"};
        char num1000[10] = {"thousand"};

        sum = 0;

    // 1~19
        for(i=1; i<=19; i++){
            printf("%s\n", num1[i]);
            sum += strlen(num1[i]);
        }

    // 20~99
        for(j=1; j<9; j++){
            printf("%s\n", num10[j]);
            sum += strlen(num10[j]);
            for(i = 1; i<=9; i++){
                printf("%s-%s\n", num10[j], num1[i]);
                sum = sum + strlen(num10[j]) + strlen(num1[i]);
            }
        }

    //100~999
        for(i=1; i<=9; i++){
            for(j=0; j<9; j++){
                if(j == 0){
                    printf("%s %s\n", num1[i], num100);
                    sum = sum + strlen(num1[i]) + strlen(num100);
                    for(k=1; k<=19; k++){
                        printf("%s %s and %s-%s\n", num1[i], num100, num10[j], num1[k]);
                        sum = sum + strlen(num1[i]) + strlen(num100) + strlen("and") + strlen(num10[j]) + strlen(num1[k]);
                    }
                }
                else{
                    for(k=0; k<=9; k++){
                        printf("%s %s and %s-%s\n", num1[i], num100, num10[j], num1[k]);
                        sum = sum + strlen(num1[i]) + strlen(num100) + strlen("and") + strlen(num10[j]) + strlen(num1[k]);
                    }
                }
            }
        }

    //1000
        printf("%s %s\n", num1[1], num1000);
        sum = sum + strlen(num1[1]) + strlen(num1000);

        printf("%d\n", sum);

        getch();
        return 0;
    }


    <<解>> 21124

    Project Euler(プロジェクトオイラー)Problem17です。
    今になって思ったのですが、今まで解答を書いてこなかった

    あぁ、それにしても、何て素人的なコード・・・
    C言語を使って書くなら、どう書くのがいいのでしょう

    アドバイスお願いします




    ☆応援お願いします☆
    にほんブログ村 IT技術ブログ C/C++へ
    にほんブログ村


    <<C言語でProject Euler 【Problem17】 その2C言語でProject Euler(プロジェクト・オイラー)に挑戦C言語でProject Euler 【Problem16】>>

    <<C言語でProject Euler 【Problem17】 その2C言語でProject Euler(プロジェクト・オイラー)に挑戦C言語でProject Euler 【Problem16】>>

    コメント

    • No title
    • 20.シーフード
    • 2011年05月07日 |
    • キャーーー追いつかれたーー

      ソースとりあえず乗せてみますー
      c言語です。てかc言語しか使えません。

      #include<stdio.h>
      #include<conio.h>
      //十の位
      int Teath(int number)
      {
      if(number == 0)
      return 0;
      else if(number == 4 || number == 5 || number == 6)
      return 5;
      else if(number == 2 || number == 3 || number == 8 || number == 9)
      return 6;
      else
      return 7;
      }
      //一桁
      int Check1(int number)
      {
      if(number == 0)
      return 0;
      else if(number == 1 || number == 2 || number == 6)
      return 3;
      else if(number == 4 || number == 5 || number == 9)
      return 4;
      else
      return 5;
      }
      //二桁
      int Check2(int number)
      {
      int i, max = 0, k;

      if(number == 11 || number == 12)
      return 6;
      else if(number == 15|| number == 16)
      return 7;
      else if(number == 13 || number == 14 || number == 18 || number == 19)
      return 8;
      else if(number == 17)
      return 9;
      else if(number == 10)
      return 3;
      else{
      for(i = 0;i <= 1;i ++){
      k = number % 10;
      number /= 10;
      if(i == 0)
      max += Check1(k);
      else
      max += Teath(k);
      }
      return max;
      }
      }
      //三桁
      int Check3(int number)
      {
      int i, k, max = 0;

      i = number / 100;
      k = number % 100;

      max += Check1(i);
      max += Check2(k);

      if(number % 100 ==0)
      return max + 7;
      else
      return max + 10;
      }
      //桁チェック
      int CheckNumber(int number)
      {
      int flg = 0, i;

      i = number;

      while(i > 0){
      i /= 10;
      flg ++;
      }
      if(flg == 1)
      return Check1(number);
      if(flg == 2)
      return Check2(number);
      if(flg == 3)
      return Check3(number);
      }

      int main(void)
      {
      int i, max = 0;

      for(i = 1;i <= 999;i ++){
      max += CheckNumber(i);
      }
      printf("%d\n",max + 11);
      getch();
      return 0;
      }

      もっとスマートにかけないかなー
    • [編集]
    • No title
    • 21.シーフード
    • 2011年05月07日 |
    • problem 14は問題の通りにプログラム組めば5秒程度で解がでましたよ~
    • [編集]
    • ほ~♪
    • 22.CEuler
    • 2011年05月11日 |
    • シーフードさん、ありがとうございます。
      まったく違うやり方ですね( ..)φメモメモ
      勝手ながら、記事として載せさせていただきます!!

      problem14はもう少し悩んでみます☆
    • [編集]

    コメントする

    トラックバック


    この記事にトラックバックする(FC2ブログユーザー)

    カテゴリ

    最新記事

    WiMAX & WiFi & モバイル

    便利ソフトいろいろ

    最新トラックバック

    最新コメント

    カウンター

    BlogRancking



    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。