|
> 間違っているとのことですが、どこがおかしいのでしょうか?
No.1828 に書いたはずですが。
#include <stdio.h>
typedef struct {
int n, d; /* 分子(numerator) と 分母(denominator) */
} Frac; /* 分数(fraction) */
Frac add(Frac a, Frac b) {
a.n = a.n * b.d + b.n * a.d; a.d *= b.d; return a; }
Frac sub(Frac a, Frac b) {
a.n = a.n * b.d - b.n * a.d; a.d *= b.d; return a; }
Frac mul(Frac a, Frac b) { a.n *= b.n; a.d *= b.d; return a; }
Frac div(Frac a, Frac b) {
if (b.n) { a.n *= b.d; a.d *= b.n; } else a.n = 9999; return a; }
int ten(Frac x) { return x.n == x.d * 10; }
typedef Frac (*Optr)(Frac, Frac);
Optr o[] = { add, sub, mul, div };
char s[] = "+-*/";
void make_ten(int d1, int d2, int d3, int d4)
{
Frac a, b, c, d; int i, j, k;
a.n = d1; b.n = d2; c.n = d3; d.n = d4;
a.d = b.d = c.d = d.d = 1;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++) {
if (ten(o[i](a, o[j](b, o[k](c, d)))))
printf("%d %c (%d %c (%d %c %d)) = 10\n",
a.n, s[i], b.n, s[j], c.n, s[k], d.n);
if (ten(o[i](a, o[k](o[j](b, c), d))))
printf("%d %c ((%d %c %d) %c %d) = 10\n",
a.n, s[i], b.n, s[j], c.n, s[k], d.n);
if (ten(o[j](o[i](a, b), o[k](c, d))))
printf("(%d %c %d) %c (%d %c %d) = 10\n",
a.n, s[i], b.n, s[j], c.n, s[k], d.n);
if (ten(o[k](o[i](a, o[j](b, c)), d)))
printf("(%d %c (%d %c %d)) %c %d = 10\n",
a.n, s[i], b.n, s[j], c.n, s[k], d.n);
if (ten(o[k](o[j](o[i](a, b), c), d)))
printf("((%d %c %d) %c %d) %c %d = 10\n",
a.n, s[i], b.n, s[j], c.n, s[k], d.n);
}
}
}
}
int main()
{
int a, b, c, d;
while (printf("4 digits: "), scanf("%1d%1d%1d%1d", &a,&b,&c,&d)==4)
make_ten(a, b, c, d);
return 0;
}
このプログラムを実行し、1234 を入力すると、
4 digits: 1234
1 + (2 + (3 + 4)) = 10
1 + ((2 + 3) + 4) = 10
(1 + 2) + (3 + 4) = 10
(1 + (2 + 3)) + 4 = 10
((1 + 2) + 3) + 4 = 10
1 * ((2 * 3) + 4) = 10
(1 * (2 * 3)) + 4 = 10
((1 * 2) * 3) + 4 = 10
4 digits: q
となりますが、これは、本来
1+2+3+4 と 1*2*3+4 の 2つの式と数えるべきではないでしょうか。
|