マツケンのマインド

とある理系大学生のブログです。基本は勉強とつぶやきとまとめです。

プロジェクトオイラー 問題4

プロジェクトオイラーの問題4をC言語で解きました!

問題はこちら↓
odz.sakura.ne.jp


問題3の解答は出ましたが、時間が1秒以内で終わらなかったので、改善中です!
 

アルゴリズム
・積のところは計算量の削減。
・積が出たら、それぞれの位の数を配列に順に入れていき、反転したものを別の変数に格納していく。
・最初の積と反転後の数値が等しいなら解である。

 

ソースコード

#include <stdio.h>
#include <time.h>

int main(void){
    int num1, num2, num3;
    int keta, ans = 0;
    int product[6] = {0};//3桁×3桁は6桁もしくは5桁
    clock_t start_clock, end_clock;

    start_clock = clock();

    for(int i = 999; i >= 100; i--){//最初から大きい数を求めに行くスタイル。全数はしない。
        for(int j = 999; j > i; j--){
            num1 = i * j;
            num2 = num1;
    if(ans > num1) break;
            for(int k = 0; k < 6; k++){//それぞれの位の数を配列に一つ一つ代入していく
                product[k] = num2 % 10;
                num2 /= 10;
            }
            keta = 1;
            num3 = 0;
            for(int k = 5; k >= 0; k--){//位を判定させた者をnum3に代入
                num3 += product[k] * keta;
                keta *= 10;
            }
            if(num1 == num3 && ans < num1){//回文数であるかどうかの判定
                    ans = num1;
                    break;
                }
            }
            
        }

    printf("求める解 %d\n", ans);

    end_clock = clock();

    printf("経過時間は%f秒\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC);

    return 0;
}

<実行結果>
求める解 906609
経過時間は0.000000秒

もっと早くいけそうな...