プログラム実行結果は以下の通り。上の出力が再帰の結果。
max:68 (((((((50 /* 9) /* 7) /* 3) /* 2) /* 5) /* 8) /* 6) /* 4 (((((((50 /* 9) /* 7) /* 3) /* 6) /* 8) /* 5) /* 2) /* 4 (((((((50 /* 9) /* 8) /* 3) /* 2) /* 5) /* 7) /* 6) /* 4 (((((((50 /* 9) /* 8) /* 3) /* 6) /* 7) /* 5) /* 2) /* 4 max:68 (((((((50 /* 9) /* 7) /* 3) /* 2) /* 5) /* 8) /* 6) /* 4 (((((((50 /* 9) /* 7) /* 3) /* 6) /* 8) /* 5) /* 2) /* 4 (((((((50 /* 9) /* 8) /* 3) /* 2) /* 5) /* 7) /* 6) /* 4 (((((((50 /* 9) /* 8) /* 3) /* 6) /* 7) /* 5) /* 2) /* 4
プログラムのソースは以下の通り。
#include "puzutl.h" int divro( int a, int b) // a/bの小数点以下を四捨五入してbを掛ける { int c = a/b, d = a%b; if( d * 2 >= b) c++; // 切り上げじゃなくて,四捨五入ってところがポイント return c*b; } YesNo used[10]; void caldiv( YesNo used[], int v[], set<string>& R, int V, int level, int& maxH) { if( level > 8) { // 最後まで計算した? if( V > maxH) { // 最大のものが出現したら R.clear(); // 今までの結果をクリアして maxH = V; } if( V == maxH) { // 最大の計算結果のものを char buf[128]; sprintf( buf, "(((((((%d /* %d) /* %d) /* %d) /* %d) /* %d) /* %d) /* %d) /* %d", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]); R.insert(buf); // 記録する } return; } for( int i=2; i< 10; i++) { // 2〜9の全ての値を調べる if( used[i]) continue; // この数は既に使用済みの used[i] = YES; v[level]= i; caldiv( used, v, R, divro(V,i), level+1, maxH); used[i] = NO; } } int main( int argc, cstring argv[]) { set<string> R; // 計算結果の文字列 int maxH = -1; // 計算結果の最大値 int V = 50; // 初期値 if(1) { // 再帰で求めてみる int value[10]; // 途中選択した数字 value[0] = V; // 初期値 int maxH = -1; caldiv( used, value, R, value[0], 1/*level*/, maxH); set<string>::iterator ite; ps( "max:%d\n", maxH); for( ite=R.begin(); ite != R.end(); ite++) { ps( "%s\n", (*ite).c_str()); } //return 0; } int A, B, C, D, E, F, G, H; for( int a=2; a< 10; a++) { used[a] = YES; A = divro(V,a); for( int b=2; b< 10; b++) { if( used[b]) continue; used[b] = YES; B = divro(A,b); for( int c=2; c< 10; c++) { if( used[c]) continue; used[c] = YES; C = divro(B,c); for( int d=2; d< 10; d++) { if( used[d]) continue; used[d] = YES; D = divro(C,d); for( int e=2; e< 10; e++) { if( used[e]) continue; used[e] = YES; E = divro(D,e); for( int f=2; f< 10; f++) { if( used[f]) continue; used[f] = YES; F = divro(E,f); for( int g=2; g< 10; g++) { if( used[g]) continue; used[g] = YES; G = divro(F,g); for( int h=2; h< 10; h++) { if( used[h]) continue; used[h] = YES; H = divro(G,h); if( H > maxH) { // より大きな計算結果が見つかった maxH = H; R.clear(); // それ以前の結果は削除する } if( H == maxH) { // 最大の計算結果を記録する char buf[128]; //sprintf( buf, "a:%d, b:%d, c:%d, d:%d, e:%d, f:%d, g:%d, h:%d", a, b, c, d, e, f, g, h); sprintf( buf, "(((((((%d /* %d) /* %d) /* %d) /* %d) /* %d) /* %d) /* %d) /* %d", V, a, b, c, d, e, f, g, h); R.insert(buf); } used[h] = NO; } used[g] = NO; } used[f] = NO; } used[e] = NO; } used[d] = NO; } used[c] = NO; } used[b] = NO; } used[a] = NO; } set<string>::iterator ite; ps( "max:%d\n", maxH); for( ite=R.begin(); ite != R.end(); ite++) { ps( "%s\n", (*ite).c_str()); } return 0; }