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

    スポンサー広告

    スポンサーサイト

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

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

    C言語でProject Euler 【Problem3】

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


    /* Problem 3 †*/
    13195 の素因数は 5、7、13、29 である。
    600851475143 の素因数のうち最大のものを求めよ。


    #include <stdio.h>
    #include <conio.h>

    int main(void)
    {
        __int64 num, ret, i;

        num = 600851475143;
        ret = 0;

        for(i=1; i<=num; i++){

            if(num % i == 0){
                ret = i;
                num = num / i;
            }

        }

        printf("%I64u\n", ret);

        getch();
        return 0;
    }


    Project Euler(プロジェクトオイラー) Problem3。
    やっとできました
    実は他の問題をやろうと思って同じような問題を探していたら、Project Euler(プロジェクトオイラー) Problem3が解けていないことを思い出しまして

    C言語で長い整数を表すのにどうすればいいのかが謎でした。
    long long int型っていうのが使えないからどうすればいいんだ!!
    とずっと思っていたんですが、__int64(_ _ int 64)という型を使うんですね。
    実はあんまりよくわかっていません・・・
    パソコンの環境によるんですよね

    ちなみに __int64型を printf するときは "%I64u を使うようです。




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


    スポンサーサイト

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

    C言語でProject Euler 【Problem5】

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


    /* Problem 5 †*/
    2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり、そのような数字の中では最小の値である。
    では、1 から 20 までの整数全てで割り切れる数字の中で最小の値はいくらになるか。


    #include <stdio.h>
    #include <conio.h>

    int main(void)
    {
        int i, num, flg;

        num=20;
        while(1){

            flg = 0;
            for(i=2; i<=20; i++){
                if(num%i != 0){
                    flg = 1;
                    break;
                }
            }

            if(flg == 0) break;
            num++;
        }

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

        getch();
        return 0;
    }


    そのまま素直に問題を解くだけなら、Project Euler(プロジェクトオイラー)の初めの方の問題の中でも難易度としてはそんなに高くないと思うのですが・・・
    ただ、このやり方だと、時間がちょっとかかるんですよね
    待てない程の時間ではないので、これでヨシとしておこう。

    C言語にかぎらず、どの言語でやったとしても、アルゴリズムを考えなおさないと、やっぱり処理は遅いんだろうな。
    いい方法があれば、教えてください



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


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

    C言語でProject Euler 【Problem4】

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



    /* Problem 4 †*/
    /* 3桁×3桁の計算結果で、回文数になる最大の数値を求めなさい。 */

    #include <stdio.h>
    #include <conio.h>

    int main(void)
    {
        int i, j, k, l;
        int x, y, z;
        int keta, max;
        int data[6];

        for(i=999; i>=100; i--){
            for(j=999; j>=100; j--){
                x = i*j;
                y = x;
    /* 配列の初期化 */
                for(k=0; k<6; k++) data[k]=0;
    /* 乗算結果を配列にセット */
                for(k=0; y>0; k++){
                    data[k] = y % 10;
                    y /= 10;
                }
    /* 桁数をセット(keta) */
                keta = k;
    /* 逆にした値をzにセット */
                l = 1;
                z = 0;
                for(k=keta-1; k>=0; k--){
                    z = z + data[k] * l;
                    l *= 10;
                }
    /* x と z が同じだったら回文数 */
                if(x == z){
                    if(max < x){
                        printf("%d × %d = %d, %d\n", i, j, x, z);
                        max = x;
                        break;
                    }
                }
            }
        }

        printf("最大値 %d\n", max);

        getch();
        return 0;
    }


    とてもおもしろい問題でした。
    どの言語でもそうですが、C言語でもやっぱり配列って絶対必要ですよね。

    回文数(かいぶんすう)とは、逆から数字を読んでも同じ数になる数のことです。
    まずは、「回文数ってなんだ!?」からはじまった問題でした

    Project Euler(プロジェクトオイラー)は、プログラムの知識だけでなく、数学的知識も必要なようです。



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




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

    C言語でProject Euler 【Problem2】

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


    /* Problem 2 †*/
    フィボナッチ数列の項は前の2つの項の和である。
    最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。
    1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
    数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。


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

    int sumCalc(int, int);

    int sumCalc(int num, int sum){
        if(num%2 == 0){
            sum += num;
        }

        return sum;
    }

    int main(void)
    {
        int num, x, y, sum=0;

        x = 1;
        y = 2;

        sum = sumCalc(x, sum);
        sum = sumCalc(y, sum);

        while(1){
            num = x + y;
            sum = sumCalc(num, sum);

            x = y;
            y = num;

            if(num>=MAX) break;
        }

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

        getch();
        return 0;
    }


    問題の意味がイマイチよくわからく、ちょっと苦戦しました。
    Problem2にして意味がわからになんて、この先大丈夫でしょうか
    恐るべし、Project Euler(プロジェクトオイラー)・・・


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


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

    C言語でProject Euler 【Problem1】

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


    /* Problem 1 †*/
    10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、これらの合計は 23 になる。
    同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。


    #include <stdio.h>
    #include <conio.h>

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

        for(i=1; i<1000; i++){
            if(i%3 == 0 || i%5 == 0)
            ans += i;
        }

        printf("合計は %d\n", ans);

        getch();
        return 0;
    }






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


    カテゴリ

    最新記事

    WiMAX & WiFi & モバイル

    便利ソフトいろいろ

    最新トラックバック

    最新コメント

    カウンター

    BlogRancking



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