SEND MORE MONEYのプログラムをCで書いてみました。孤独の7つながりで、なんか作りたくなってしまいました。(^_^;
/* * SendMoreMoney.c * * SEND * +MORE * ----- * MONEY * */ #include <stdio.h> #include <time.h> #define MAXN 16 /* nとrの最大値 */ int Perm[MAXN+1]; /* 結果はPerm[1]からPerm[r]に入ります。 */ int InitGenPerm=0; /* 初期化用グローバル変数 */ /* 順列生成 : 1〜nまでの数字からr個並べる順列を生成 */ int GenPerm(int n, int r) { static int i[MAXN+1]; int j,k,flag; if(n>MAXN || r>MAXN) return(0); if(InitGenPerm){ for(k=r; i[k]==n; k--); i[k]++; }else InitGenPerm=k=i[k]=1; /* 最初に1回だけ初期化 */ while(k>0){ while(1){ /* 無限ループ */ Perm[k]=i[k]; for(flag=0,j=1; j<=k-1; j++) if(Perm[k]==Perm[j]) flag=1; if(flag) break; else if(k==r) return(1); else i[++k]=1; } for(; i[k]==n; k--); i[k]++; } return(0); } #define Horner(p,q,r,s,t) (10*(10*(10*(10*(p)+(q))+(r))+(s))+(t)) /* ホーナー法 */ #define Pm(i) (Perm[i]-1) /* 略記用 */ int main(void) { int s,e,n,d,m,o,r,y; int t1,t2,t3,t4; clock_t start, end, dt; start=clock(); /* タイマースタート */ while(GenPerm(10,8)){ s=Pm(1),e=Pm(2),n=Pm(3),d=Pm(4),m=Pm(5),o=Pm(6),r=Pm(7),y=Pm(8); if(!(s*m)) continue; /* (s==0||m==0)ならスキップ */ t1=Horner(0,s,e,n,d); /* 10000*0+1000*s+100*e+10*n+d; */ t2=Horner(0,m,o,r,e); t3=Horner(m,o,n,e,y); t4=t1+t2; if(t3!=t4) continue; /* チェックを潜り抜けたものだけを出力 */ printf(" %d\n",t1); printf("+%d\n",t2); printf("-----\n"); printf("%d\n",t3); printf("\n"); } end=clock(); /* タイマーストップ */ dt=end-start; printf("Runtime : %ld.%03ld [sec]\n",dt/1000,dt%1000); return(0); }
●出力結果
9567 +1085 ----- 10652 Runtime : 0.359 [sec]
ちなみに、マシンスペックは、プロセッサ:Intel(R)Core(TM)2 Duo CPU E4500 @2.20GHz 1.10GHzです。(^_^;
ネットで調べたら、いいのを見つけました。やはり、自作よりネットの方がいいみたいです。(^_^;
※参考URL
●C言語関係掲示板 過去ログ1325
●SEND MORE MONEY(2) C++ - rscの日記
●SEND MORE MONEY(3) C言語プログラム - rscの日記
●SEND MORE MONEY JavaScriptプログラム - rscの日記
●SEND MORE MONEY in Java - rscの日記
●SEND MORE MONEY in Python - rscの日記
●SEND MORE MONEY in Ruby - rscの日記
●SEND MORE MONEY in Python(2) - rscの日記
●SEND MORE MONEY in Ruby(2) - rscの日記
●SEND MORE MONEY in Python(3) - rscの日記