123456789の9個の数字の間に×または÷を入れて計算結果が266になるようにする。
最初答えが沢山出力されて,「あれ?」っと思って問題をよく見ると演算子は×と÷だけだった。
結果の266の意味は何かなと思ったけど,投稿問題なので特段意味は無いか。
計算式を文字列で作って後はその式を計算するだけ。

数字の間に演算子を挟んでいく。メインのソースは以下の通り。
int main( int argc, cstring argv[])
{
char ope[] = { '\0', '*', '/'}; // 途中に挟める演算は×と÷だけ,+,−は挟めない。'\0'は数字を連結するため。
char cal[100]; // 計算式をここに入れる。
astring p = cal;
for( int a=0; a< sizeof(ope); a++) {
*p++ = '1';
if(ope[a]) *p++ = ope[a]; // 演算子があるときは数字の間に挿入する
for( int b=0; b< sizeof(ope); b++) {
*p++ = '2';
if(ope[b]) *p++ = ope[b];
for( int c=0; c< sizeof(ope); c++) {
*p++ = '3';
if(ope[c]) *p++ = ope[c];
for( int d=0; d< sizeof(ope); d++) {
*p++ = '4';
if(ope[d]) *p++ = ope[d];
for( int e=0; e< sizeof(ope); e++) {
*p++ = '5';
if(ope[e]) *p++ = ope[e];
for( int f=0; f< sizeof(ope); f++) {
*p++ = '6';
if(ope[f]) *p++ = ope[f];
for( int g=0; g< sizeof(ope); g++) {
*p++ = '7';
if(ope[g]) *p++ = ope[g];
for( int h=0; h< sizeof(ope); h++) {
*p++ = '8';
if(ope[h]) *p++ = ope[h];
*p++ = '9';
*p = NIL;
eval(cal); // 1〜9までの数字を使った式を評価する
--p; // '9' の分
if(ope[h]) --p;
--p; // '8' の分
}
if(ope[g]) --p;
--p; // '7' の分
}
if(ope[f]) --p;
--p; // '6' の分
}
if(ope[e]) --p;
--p; // '5' の分
}
if(ope[d]) --p;
--p; // '4' の分
}
if(ope[c]) --p;
--p; // '3' の分
}
if(ope[b]) --p;
--p; // '2' の分
}
if(ope[a]) --p;
--p; // '1' の分
}
return 0;
}
eval( )の中で計算結果が266になる場合を出力する。
答えは1件出力されました。
これとは別に再帰を使って以下のように解くことも出来る。
const int N = 9;
int ope[N+1]; // 演算子
void find( char prev_ope, char new_ope, int n, int bunsi, int bunbo, int ope_val)
// prev_ope :確定演算子(実際に計算する演算子)
// new_ope :次の演算子(数字の連結を示すための' 'の場合もあるので必ず「演算子」という訳ではない)
// n :1〜9までの数字
// bunsi,bunbo :現在までの計算結果(割り算があるので分子,分母で記憶する)
// ope_val :被演算子(new_opeが' 'の場合演算を保留するのでnを計算に使えない)
{
if( n > N || new_ope != ' ') { // この時点までの計算式が確定する。
if( prev_ope == '*') bunsi = bunsi * ope_val; // 掛け算は分子のみに作用
if( prev_ope == '/') bunbo = bunbo * ope_val; // 割り算は分母のみに作用
prev_ope = new_ope;
ope_val = n;
}
else {
ope_val = ope_val * 10 + n; // 計算式が確定しないので被演算子は10倍して記憶
}
if( n > N) {
if( new_ope == ' ' && (bunsi/bunbo) == 266 && (bunsi%bunbo) == 0) { // 計算結果が266になるか?
// Find
}
return;
}
ope[n] = new_ope; // 演算子を記憶しておく
find( prev_ope, ' ', n+1, bunsi, bunbo, ope_val);
find( prev_ope, '*', n+1, bunsi, bunbo, ope_val);
find( prev_ope, '/', n+1, bunsi, bunbo, ope_val);
}
int main( int argc, cstring argv[])
{
find( ' ', ' ', 1, 1, 1, 0);
return 0;
}
北朝鮮がとうとう核実験を実施。実際に行われたかどうかについては色々言われているけど…
制裁論議において「諸外国の対応を見極めながら」という声が聞こえて来ないのは良いこと。いつも他人の尻馬に乗る外交政策ばかり続けてきたからね。
解速度
即