[入試数学]阪大2017理系大問2をC言語で解いてみた

C言語

問題内容

阪大 2017 理系 大問2 です

複素数と確率の複合問題ですね。
普通に解いたらむずそう。
(3)だけ解きます。



コード

#include <stdio.h>
#include <math.h>

typedef struct complex {
    double r;
    double i;
}complex;


void cre_z(int N,complex z[]){
    for(int i=0; i<N; i++){
        z[i].r = cos(2*i*M_PI/N);
        z[i].i = sin(2*i*M_PI/N);
     
    }
}

void clear_comp(complex *w){
    w->i = 0;
    w->r = 0;
}

complex func(int a,int b,int c, int d, int e){
    complex w;
    clear_comp(&w);
    
    complex z[5];
    for(int j=0; j<5; j++)
        clear_comp(&z[j]);
    
    cre_z(5,z);
    
    w.r = a + b*z[1].r + c*z[2].r + d*z[3].r + e*z[4].r;
    w.i =b*z[1].i + c*z[2].i + d*z[3].i + e*z[4].i;
    
    return w;
}

double length(complex w){
    return sqrt((w.r*w.r)+(w.i*w.i));
}

int all_c = 0;
int ok = 0;

int main(void){
    complex w;
    
    for(int a=0; a<=1; a++){
        for(int b=0; b<=1; b++){
            for(int c=0; c<=1; c++){
                for(int d=0; d<=1; d++){
                    for(int e=0; e<=1; e++){
                        clear_comp(&w);
                        w = func(a, b, c, d, e);
                        if(length(w) < 0.99999)                        
                            ok++;
                        
                        all_c++;
                    }
                }
            }
        }
    }
    
    printf("%d/%d\n",ok,all_c);
    printf("%f\n",(double)ok/all_c);
    
    return 0;
}

まあ普通にa0~a4をすべての場合で総当りで確認してきますね。

z(1のn乗根)はオイラーの公式を用いて求めました。関数cre_zのとこです。

で、wとその長さを求めるのも関数にしました。

forの中で条件を満たしていればokをインクリメント、
どちらの場合でもall_cをインクリメントして
ok/all_cを計算すればおkって感じです。

if文が <1 だと何故かlengthが1.0000でも条件を満たしていることになって答えが合わなかったので<0.99999にしました。マジでなんでやろ。



感想

全体的にはすぐに方針がたったので簡単でした。
プログラミング使わずに解いたらちょっと頭使いそうな感じなんでこっちのほうが楽かも。

ただif文の<1がだめな理由は結構考えたけど、思いつかなかったので分かる人いたら教えて下さい(他力本願)

コメント

タイトルとURLをコピーしました