スポンサー広告

    スポンサーサイト

    上記の広告は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++へ
    にほんブログ村


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


    Project Euler(プロジェクト・オイラー)【Problem 11~15】

    C言語でProject Euler 【Problem13】

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

    /* Problem 13 †*/
    以下の50桁の数字100個の総和の上位10桁を求めよ。
    problem13.txt


    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #define LINE_BUF 1024

    int main(void)
    {
        int i, j, k, sum;
        char buf[100][LINE_BUF], str[1], ans[LINE_BUF];
        FILE *fp = fopen("problem13.txt", "r");

    // テキストファイルの読み込み
        i=0;
        while(fgets(buf[i], sizeof buf, fp)){
            i++;
        }

        sum = 0;
        k = 0;

        for(j=49; j>=0; j--){
    // 一桁づつ足し算する
            for(i=0; i<100; i++){
                str[0] = buf[i][j];
                sum += atoi(str);
            }

    // 足し算の結果を配列askに代入
            ans[k] = sum%10;
        // 合計結果の繰上げ
            sum = (int)sum / 10;
            k++;
        }

    // 残りの桁を配列askに代入
        while(sum>0){
            ans[k] = sum%10;
            sum = (int)sum / 10;
            k++;
        }

    // 配列ask(合計)の表示
        for(i=k-1; i>=k-10; i--){
            printf("%d", ans[i]);
        }

    // テキストファイルを閉じる
        fclose(fp);

        getch();
        return 0;
    }


    Project Euler(プロジェクトオイラー) Problem13。
    problem13.txt
    をつくって、テキストファイルの読み込みを使ってみました。

    C言語でやるとなると、桁数の関係で、文字列配列でやるしかない
    と思いやってみました。

    どうなんでしょう・・この方法は





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


    Project Euler(プロジェクト・オイラー)【Problem 11~15】

    教えてください!!C言語でProject Euler 【Problem12】

    Project Euler(プロジェクトオイラー)のproblem12☆
    なんですが

    /* Problem 12 †*/
    三角数の数列は自然数の和で表わされ、
    7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である。

    三角数の最初の10項は
    1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...となる。
    最初の7項について、その約数を列挙すると、以下のとおり。
    1: 1
    3: 1,3
    6: 1,2,3,6
    10: 1,2,5,10
    15: 1,3,5,15
    21: 1,3,7,21
    28: 1,2,4,7,14,28

    これから、7番目の三角数である28は、6個以上の約数をもつ最初の三角数であることが分る。
    では、501 個以上の約数をもつ最初の三角数はいくらか。



    という問題なので

    C言語を使ってProject Euler(プロジェクトオイラー)のproblem12に挑戦中です。

    普通にというか、一応やってみたんですけど、時間があまりにもかかり過ぎて使い物になりません。
    どういう考えかたをすればいいのでしょう・・・
    どなたか教えてください



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


    C言語の記述について

    C言語の記述について【タブと全角スペース】

    C言語の記述についてです。
    C言語(とは限りませんが)、プログラムを記述するとき、
    字下げを使いますよね。

    #include
    int main()
    {
            printf("Hello World\n");
    }

             の箇所のことです。
    本来なら「tab(タブ)」を使って字下げするべきだと思います。

    でもここでは、半角のスペースを使っています。
    HTMLではタブにできないんですよ

    HTMLでは半角スペースもそのまま書くだけだと、文字がないものとされ、字下げできません。
    なので、はじめは全角スペースをいれていました。
    でも、全角スペースがはいっていると、コピペをしたときに、やっかいなんですよね。

    他のサイトからコピペしてみて、面倒だな~、と思ったことがあったのですが、
    あらためて自分のサイトからコピペしてみて、このままではいけない!と思いました。

    と言うことで、HTMLでの半角スペースの記述方法を調べたところ、ありました
    HTMLで半角スペースを書きたいときは、

    &nbsp;

    と書けばいいんですね

    これを使えば、コピペしても半角スペースになるので、そのままコンパイルもできます。
    今までにつくったページも全部書き換えましたので、どのプログラムでも、コピペしてそのまま使ってもらうことができます。

    C言語だけでなく、必然的にHTMLの勉強もできてしまいました♪
    気づくのが遅くなってしまい、ご迷惑おかけしました



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


    カテゴリ

    最新記事

    WiMAX & WiFi & モバイル

    便利ソフトいろいろ

    最新トラックバック

    最新コメント

    カウンター

    BlogRancking



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