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

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

    スポンサー広告

    スポンサーサイト

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

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

    C言語でProject Euler 【Problem14】

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


    /* Problem 14 † */
    正の整数に以下の式で繰り返し生成する数列を定義する。

    n → n/2 (n が偶数)
    n → 3n + 1 (n が奇数)

    13からはじめるとこの数列は以下のようになる。
    13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

    13から1まで10個の項になる。この数列はどのような数字からはじめても
    最終的には 1 になると考えられているが、
    まだそのことは証明されていない(コラッツ問題)

    さて、100万未満の数字の中でどの数字からはじめれば一番長い数列を生成するか。
    注意: 数列の途中で100万以上になってもよい


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

    unsigned int keisan(unsigned int);
    unsigned int saiki(unsigned int);

    unsigned int data[MAX];
    unsigned int dt;

    int cnt;

    unsigned int keisan(unsigned int n){

        if(n%2 == 0)
            n = n/2;
        else
            n = 3*n + 1;
        return n;
    }

    unsigned int saiki(unsigned int n)
    {
        cnt++;
    //printf("%d, ", n);

        if(n == 1)
            return cnt;
        if(MAX < n)
            return saiki(keisan(n));
        if(data[n-1] != 0)
            return cnt + data[n-1]-1;

        return saiki(keisan(n));
    }

    int main(void)
    {
        unsigned int n;
        int i, j, max_cnt, max_num;

        dt = 0;
        max_cnt = 0;

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

        for(i = 1; i<=MAX; i++){
            cnt = 0;
            cnt = saiki(i);

            data[i-1] = cnt;

            if(max_cnt < cnt){
                max_cnt = cnt;
                max_num = i;
            }
        }

        printf("max %d, %d\n", max_cnt, max_num);

        getch();
        return 0;
    }



    <<解>> 837799


    Project Euler(プロジェクトオイラー)Problem14です。
    これがC言語の再帰かー

    はじめ、そのまんま組んでみたら、時間がかかって使い物にならず・・・
    この再帰呼び出しとやらを使ってみたら、一瞬で処理できました。

    使い方あってるんですかね!?
    C言語の再帰呼び出し、何かアドバイスあったら教えてください

    できた!と思っても答えが合わないでずっと悩んでいたら、
    項の数を出していました
    なんて初歩的なミス・・・
    ちなみに項の数は 525 です。



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


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

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

    コメント

    コメントする

    トラックバック


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

    カテゴリ

    最新記事

    WiMAX & WiFi & モバイル

    便利ソフトいろいろ

    最新トラックバック

    最新コメント

    カウンター

    BlogRancking



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