以下のような問題ですね。
1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となるとてもいい問題だと思うし、一方で上の回答例がeval的な手法を使っていたので、そういうズルをせずに解いたらどうなるだろう、ということでCで書いてみた。
正解が出るようになるまでの所要時間、約30分。なんとかプログラマ合格のようです。
#include <stdio.h>
#define MAX_POS 9
#define EXPECTED 100
static char buf[32];
static void doit(int pos, int sum, char *p, int sign)
{
int i, n, s;
*p++ = sign == 1 ? '+' : '-';
for (i = pos, n = 0; i <= MAX_POS; ++i, n *= 10) {
*p++ = '0' + i;
n += i;
s = sum + sign * n;
if (i == MAX_POS) {
if (s == EXPECTED) {
*p = '\0';
printf("%s = %d\n", buf + 1, s);
}
} else {
doit(i + 1, s, p, 1);
doit(i + 1, s, p, -1);
}
}
}
int main(void)
{
doit(1, 0, buf, 1);
return 0;
}
No comments:
Post a Comment