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

    スポンサー広告

    スポンサーサイト

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

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

    C言語でProject Euler 【Problem19】

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

    /* Problem 19 † */
    /*
    次の情報が与えられている。

    ・1900年1月1日は月曜日である。
    ・9月、4月、6月、11月は30日まであり、2月を除く他の月は31日まである。
    ・2月は28日まであるが、うるう年のときは29日である。
    ・うるう年は西暦が4で割り切れる年に起こる。

    しかし、西暦が400で割り切れず100で割り切れる年はうるう年でない。
    20世紀(1901年1月1日から2000年12月31日)で月の初めが日曜日になるのは何回あるか。
    */


    #include <stdio.h>
    #include <conio.h>
    int uruChk(int);

    int uruChk(int yyyy)
    {
        if(yyyy % 400 != 0 && yyyy % 100 == 0)
            return 28;
        else if(yyyy % 4 == 0)
            return 29;
        else
            return 28;
    }

    int main(void)
    {
        int y, m, d;
        int i, cnt = 0;
        int d1;

        i = 0;

        for(y = 1900; y <= 2000; y++){
        for(m = 1; m <= 12; m++){
                if(m == 9 || m == 4 || m == 6 || m == 11)
                    d1 = 30;
                else if(m == 2)
                    d1 = uruChk(y);
                else
                    d1 = 31;

                for(d = 1; d <= d1; d++){
                    i++;
                    if(i % 7 == 0){
                        if(d == 1 && y >= 1901)
                            cnt++;
                        i = 0;
                    }
                }
            }
        }

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

        getch();
        return 0;
    }



    <<解>> 171


    Project Euler(プロジェクトオイラー)Problem19です。
    C言語で書いています。

    我ながら美しくないコード
    そのまんま書いただけ・・って感満載

    その上、解が合わない・・と思っていたら、求めるのは1900年からではなく、1901年からでした。

    いかにも素人なコードなんですが、どうしたらいいんでしょう。
    アドバイス等ありましたら、ぜひともご教授ください



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


    スポンサーサイト

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

    C言語でProject Euler 【Problem18】

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


    /* Problem 18 † */
    /*
    以下の三角形の頂点から下まで移動するとき、その数値の合計の最大値は23になる。

    3
    7 4
    2 4 6
    8 5 9 3

    この例では 3 + 7 + 4 + 9 = 23

    以下の三角形を頂点から下まで移動するとき、その最大の合計値を求めよ。

    75
    95 64
    17 47 82
    18 35 87 10
    20 04 82 47 65
    19 01 23 75 03 34
    88 02 77 73 07 63 67
    99 65 04 28 06 16 70 92
    41 41 26 56 83 40 80 70 33
    41 48 72 33 47 32 37 16 94 29
    53 71 44 65 25 43 91 52 97 51 14
    70 11 33 28 77 73 17 78 39 68 17 57
    91 71 52 38 17 14 91 43 58 50 27 29 48
    63 66 04 68 89 53 67 30 73 16 69 87 40 31
    04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

    注: ここではたかだか 16384 通りのルートしかないので、すべてのパターンを試すこともできる。
    Problem 67 は同じ問題だが100行あるので、総当りでは解けない。もっと賢い方法が必要である。
    */



    #include <stdio.h>
    #include <conio.h>
    #define R 15
    #define C 15

    int func(int);
    int sum, cnt;
    int data[R][R]={
        {75},
        {95, 64},
        {17, 47, 82},
        {18, 35, 87, 10},
        {20, 4, 82, 47, 65},
        {19, 1, 23, 75, 3, 34},
        {88, 2, 77, 73, 7, 63, 67},
        {99, 65, 04, 28, 6, 16, 70, 92},
        {41, 41, 26, 56, 83, 40, 80, 70, 33},
        {41, 48, 72, 33, 47, 32, 37, 16, 94, 29},
        {53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14},
        {70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57},
        {91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48},
        {63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31},
        { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23}
    };

    int func(int i)
    {
        int num, j;

        if(i < 0)
            return sum;

        for(j=0; j<cnt-1; j++){
            num = data[i][j];
            if(data[i+1][j] < data[i+1][j+1])
                num += data[i+1][j+1];
            else
                num += data[i+1][j];

            data[i][j] = num;
        }

        for(j = 0; j < cnt-1; j++)
            printf("%d, ", data[i][j]);
        printf("\n");

        cnt--;

        func(i-1);
        return 0;
    }

    int main(void)
    {
        int i, j;

        for(i=0; i<R; i++){
            for(j=0; j<C; j++)
                printf("%d, ", data[i][j]);
            printf("\n");
        }

        cnt = C;
        func(R-2);;

        getch();
        return 0;
    }



    <<解>> 1074


    Project Euler(プロジェクトオイラー)Problem18です。
    上から順番に最大値を探していけばいい!と思ったら大きな間違いでした

    下から順番に、大きいほうを残して、上にあがって行く方法です。

    少し期間があいてしまいました・・
    がんばらねば☆C言語





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


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

    C言語でProject Euler 【Problem17】 その2

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

    私の解き方は C言語でProject Euler 【Problem17】 だったのですが、
    コメントいただいたシーフードさんはまったく違うやり方でしたので、載せさせていただきます


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



    <<解>> 21124

    Project Euler(プロジェクトオイラー)Problem17
    同じC言語を使っても、いろいろな考え方ができるもんですね。

    C言語でProject Euler 【Problem17】



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


    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++へ
    にほんブログ村


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

    C言語でProject Euler 【Problem16】

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


    /* Problem 16 †*/
    2^15 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。
    同様にして、2^1000 の各数字の合計を求めよ。


    #include <stdio.h>
    #include <conio.h>
    #define MAX 500

    int main(void)
    {

      int i, j;
      int sum, k1, k2;
      int str[MAX];

      for(i=0; i<MAX; i++){
        str[i] = 0;
      }

      str[0] = 1;
      for(i=1; i<=1000; i++){
        k1 = str[0];
        sum = k1 * 2;

        k2 = sum / 10;
        k1 = sum - k2*10;

        str[0] = k1;
        j = 1;
        while(j < MAX-1){
          sum = str[j] * 2 + k2;
          k2 = sum / 10;
          k1 = sum - k2*10;

          str[j] = k1;
          j++;
        }
        if(k2 != 0){
          str[j] = k2;
        }
      }

      sum = 0;
      for(i=MAX-1; i>=0; i--){
        sum += str[i];
        printf("%d", str[i]);
      }

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

      getch();
      return 0;
    }


    できた
    Project Euler(プロジェクトオイラー) Problem16。

    C言語を使っているので、どうしても桁数の制限が・・・
    そこで、やっぱり配列ですよね

    Project Euler(プロジェクトオイラー)実はProblem14で悩み中・・・
    あまりにも時間がかかるので、どうすればいいのか

    ちょっと気分を換えてProblem16をやってみました。
    できた!のうれしさに、そのまま載せたものの、もっとすっきり書けそうなきもします



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


    カテゴリ

    最新記事

    WiMAX & WiFi & モバイル

    便利ソフトいろいろ

    最新トラックバック

    最新コメント

    カウンター

    BlogRancking



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