SEND MORE MONEY C言語プログラム

 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の日記