[入試数学]京大2020理系大問4をC言語で解いてみた

問題内容

京大 2020 理系 大問4 です

今回は整数の問題です。
本当は色々場合分けしたり、modを使ったりとめんどくさいんでしょうね

まあ僕にはC言語があるのでガン無視して全探索でやっていきます
最大の探索数が30*30=900なんで人間だったら不可能ですね。
コンピュータなら楽勝。



コード

#include <stdio.h>

int B(int N){
    int count=0;
    
    while(1){
        if(N%3==0){
            N /= 3;
            count ++;
        }else
            return count;
    }
    
}

int func(int m,int n){
    return m*m*m + n*n + n +3;
}

int main(int argc, const char * argv[]) {
    int max=0;
    
    for(int m=1; m<=30; m++){
        for(int n=1; n<=30; n++){
            if(n%3 != 0){
                if(B(func(m,n))>max)
                    max = B(func(m,n));
            }
        }
    }
    
    for(int m=1; m<=30; m++){
           for(int n=1; n<=30; n++){
               if(n%3 != 0 && (B(func(m,n)) == max))
                   printf("%d,%d\n",m,n);
           }
    }
    
    return 0;
}

関数Bが問題本文のB()です。
とりあえず仮引数が3で割れるかを調べます。

割れるなら、仮引数を3で割って、countをインクリメント、
割れないならcountを返して関数の処理終了。

この作業を無限ループして仮引数に渡された整数の公約数3の数をすべて数えます。


mainでは一旦二重ループで最大値を求めてます。

二回目の二重ループでは最大値を取るm,nを調べてます。



感想

C言語があれば京大整数も楽勝ですね。
あとやっぱ整数の取りうる範囲決まってると方針が立ちやすいので嬉しいです。


ではまた、

syumokuzame

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする