スポンサーサイト

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

七行プログラミング@2chのコードを解析しよう 第二回

今回も円周率。ただし前回のような無駄な手順は踏まない。

まずはこれ。part4の832

832 :デフォルトの名無しさん:05/02/01 09:13:43
    //3.141592653
    #include <stdio.h>
    typedef double d;d p(d x,d y,d X,d Y,int D){d w=X-x,h=Y-y;if(!D)return w*h/2;
    else if(X*X+Y*Y<1)return w*h;else if(x*x+y*y>1)return 0;else{w/=2;h/=2;D--;
    return p(x,y,x+w,y+h,D)+p(x+w,y,X,y+h,D)+p(x,y+h,x+w,Y,D)+p(x+w,y+h,X,Y,D);}}
    main(){printf("%.9f",p(0,0,1,1,24)*4);}

これはコードとにらめっこするしかない。正方形を一辺 2-24 の小正方形に区切り、四分円の面積を求めているようだ。

次はこっち。同じくpart4の861

861 :デフォルトの名無しさん :05/03/04 22:41:57
    /*2000桁目あたりで間違える。*/
    #include <stdio.h>
    #define s (4000+10)
    void main(){long a[s]={3},b[s]={0},i=1,j,k,l,m;for(m=k=1;m;i++){k+=8*i-8,l=i*(16
    *i+8);for(j=0;j<s-1;)b[j]+=a[j],a[j++]*=k;for(m=j=0;j<s-1;)a[j+1]+=(a[j]%l)*10,m|=a[j],a
    [j++]/=l;}for(i=s-2;i;)b[i-1]+=b[i]/10,b[i--]%=10;for(i=1;i<s-10;)printf("%d",b[i++]);}

    円周率を求めるプログラム
    計算が違うのはご愛嬌

こっちは \(\frac{\pi}{6}=\arcsin\frac{1}{2}\) を使っているようだ。計算が違うというのはどこかでオーバーフローしているからだろうか(未確認)。

スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

七行プログラミング@2chのコードを解析しよう

ソースコードを縮めるのも頭を使うが、その逆も頭を使う。

今回解析するのはこれ。七行プログラミング part2より勝手に転載。かの「トリッキーの1」氏のコード。

827 名前: トリッキーの1  投稿日: 02/09/20 15:54
    円周率です。意外と七行は簡単でした。オイラーの公式使ってますので収束遅いです。

    #include <stdio.h>
    #define s ( 5000 /*←希望する桁数*/ /4+2)
    int main(){int i,n,c,t,j,l,a[]={4,9},r[s][4]={0,0,8,12},k=10000;for(n=0;n<s*15
    ;n++)for(i=0;i<2;i++){for(c=t=j=0;j<s;r[j++][i]+=((n&1)*-2+1)*l/(2*n+1))t=(l=k
    *t+r[j][i+2])%a[i],c=(l=k*c+(r[j][i+2]=l/a[i]))%(2*n+1);for(t=0,j--;j+1;r[j--]
    [i]%=k)t=(r[j][i]+=k+t)/k-1;}for(i=s-(t=1);i+1;*r[i--]%=k)t=(*r[i]=k+*r[i]+r[i
    ][1]+t)/k-1;printf("%d.",**r);for(i=1;i<s-1;printf("%04d",*r[i++]));return 0;} 

こいつはどうやって円周率を計算しているのか。「オイラーの公式」と書いてあるが、オイラーの名を冠した公式なんていくらでもある。仕方ないからコードを解析して確認しよう。

続きを読む

テーマ : プログラミング | ジャンル : コンピュータ

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。