結果の出力など、ちょっと改良してみました。(^_^;
実行時間の測定には、ネットでいい関数を見つけたので書き直しました。(^_^;
/* lonely7.c */ #include <stdio.h> #include <string.h> #include <time.h> #define Horner(p,q,r,s,t) (10*(10*(10*(10*(p)+(q))+(r))+(s))+(t)) #define GetNum(x,n) (((x)/(n))%10) /* x の n の位の数を取り出すマクロ */ /* 桁数を求める関数 */ int check_keta(int x) { char buf[32]; sprintf(buf,"%d",x); return(strlen(buf)); } int main(void) { /* Borland C++ ではintもlongも同じようです。(^_^; */ int dvd; /* 元の割られる数 dividend */ int quo; /* 商 quotient */ int dvs; /* 割る数 divisor */ int rem; /* 計算途中の余り remainder */ int tmp; /* 計算途中の割られる数 */ int a,b,c=0,d; /* 商の各桁 c=0は形から既知としました。(^_^; */ clock_t start, end; char line[16][32]; /* 結果の出力用 少し多めに余裕をもって */ int i; start=clock(); /* タイマースタート */ for(dvs=100; dvs<200; dvs++){ /* 割る数の百の位は1 */ for(a=1; a<10; a++){ /* 商の先頭は、0以外の数 */ for(b=0; b<10; b++){ for(d=0; d<10; d++){ /* quo=10000*a+1000*7+100*b+10*c+d; */ quo=Horner(a,7,b,c,d); dvd=quo*dvs; /* 消去法でスキップ */ if(check_keta(dvs*a)!=4) continue; if(check_keta(dvs*7)!=3) continue; if(check_keta(dvs*b)!=3) continue; if(check_keta(dvs*d)!=4) continue; tmp=dvd/10000; rem=tmp%dvs; if(check_keta(rem)!=2) continue; tmp=rem*10+GetNum(dvd,1000); sprintf(line[ 5]," %d",tmp); rem=tmp%dvs; if(check_keta(rem)!=3) continue; tmp=rem*10+GetNum(dvd,100); sprintf(line[ 8]," %d",tmp); rem=tmp%dvs; if(check_keta(rem)!=2) continue; tmp=rem*10+GetNum(dvd,10); rem=tmp%dvs; if(rem!=tmp) continue; tmp=rem*10+GetNum(dvd,1); sprintf(line[11]," %d",tmp); /* チェックを潜り抜けたものだけを出力 */ sprintf(line[ 0]," %d",quo); sprintf(line[ 1]," ---------"); sprintf(line[ 2],"%d)%d",dvs,dvd); sprintf(line[ 3]," %d",dvs*a); sprintf(line[ 4]," -----"); /* sprintf(line[ 5]," %d",tmp); */ sprintf(line[ 6]," %d",dvs*7); sprintf(line[ 7]," ----"); /* sprintf(line[ 8]," %d",tmp); */ sprintf(line[ 9]," %d",dvs*b); sprintf(line[10]," ------"); /* sprintf(line[11]," %d",tmp); */ sprintf(line[12]," %d",dvs*d); sprintf(line[13]," ----"); sprintf(line[14]," 0"); for(i=0; i<15; i++) printf("%s\n",line[i]); printf("\n"); } } } } end = clock(); /* タイマーストップ */ printf("Runtime : %ld.%03ld [sec]\n",(end-start)/1000,(end-start)%1000); return(0); }
●出力結果
97809 --------- 124)12128316 1116 ----- 968 868 ---- 1003 992 ------ 1116 1116 ---- 0 Runtime : 0.031 [sec]
※参考URL
http://q.hatena.ne.jp/1297128814
●C言語 プログラム実行時からの時間を取得 - time.h - [ clock ] | 勇躍 ...
http://simd.jugem.jp/?eid=145
Borland C++はこちらの付録について来たものを使いました。(^_^;