質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1143閲覧

【C言語】Make10「8115」が解けない(整数型)

izuki_y

総合スコア65

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/01/10 06:33

C言語で入力した数字で10が作れるかどうかを確認するMake10作りました。
試しに色々な数字を入れて確認しましたが、「8115」が解けません。
(8÷(1-(1÷5)))=10になるのを期待したんだけどなぁ。

Floatとかdouble使うしかないのでしょうか。

C

1#include <stdio.h> 2 3typedef int (*Op)(int, int); 4int add(int a, int b) { return (a + b); } 5int sub(int a, int b) { return (a - b); } 6int mul(int a, int b) { return (a * b); } 7int div(int a, int b) { return b ? (a / b) : 9999; } 8 9Op o[] = { add, sub, mul, div }; 10char* op_str[] = { "+", "-", "×", "÷" }; 11 12int main() { 13 int num[4] = { 0 }; 14 int a, b, c, d; // オペランド 15 int i, j, k; // 演算子 16 int n; 17 18 // 標準入力(エラーチェックなし) 19 char str[256]; 20 printf("4桁の数字を入力してください。\n"); 21 scanf_s("%s", str,256); 22 printf("入力値は「%s」です。\n", str); 23 24 a = str[0] - '0'; 25 b = str[1] - '0'; 26 c = str[2] - '0'; 27 d = str[3] - '0'; 28 29 for (i = 0; i < 4; i++) { 30 for (j = 0; j < 4; j++) { 31 for (k = 0; k < 4; k++) { 32 // (a+b)+(c+d) 33 if (o[j](o[i](a, b), o[k](c, d)) == 10) { 34 printf("(%d %s %d) %s (%d %s %d)\n", a, op_str[i], b, op_str[j], c, op_str[k], d); 35 } 36 37 // {(a+b)+c}+d 38 if(o[k](o[j](o[i](a, b), c),d) == 10){ 39 printf("{(%d %s %d) %s %d} %s %d\n", a, op_str[i], b, op_str[j], c, op_str[k], d); 40 } 41 42 // a+{b+(c+d)} 43 if (o[i](a, o[j](b, o[k](c, d))) == 10) { 44 printf("%d %s {%d %s (%d %s %d)}\n", a, op_str[i], b, op_str[j], c, op_str[k], d); 45 } 46 47 // {a+(b+c)}+d 48 if(o[k](o[i](a, o[j](b, c)), d) == 10){ 49 printf("{%d %s (%d %s %d)} %s %d\n", a, op_str[i], b, op_str[j], c, op_str[k], d); 50 } 51 // a+{(b+c)+d} 52 if (o[i](a, o[k](o[j](b, c), d)) == 10) { 53 printf("%d %s {(%d %s %d) %s %d}\n", a, op_str[i], b, op_str[j], c, op_str[k], d); 54 } 55 } 56 } 57 } 58}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2022/01/10 07:58

4桁の数字を入力してください。2345 入力値は「2345」です。 {2 + (3 ÷ 4)} × 5 {2 - (3 ÷ 4)} × 5 {(2 × 3) - 4} × 5 2 × {(3 ÷ 4) + 5} 分数を使わないとだめです。
thkana

2022/01/10 08:04

その質問の場合だけに限定するなら固定小数点というのも考えますが、一般に大丈夫かというと私の手に余る...
episteme

2022/01/10 08:17

struct rational { int num, den; /* 分子,分母 */ }; を定義し、こいつの四則演算をこしらえれば。
guest

回答3

0

c

1#include <stdio.h> 2 3typedef struct { int n, d; } frac; 4typedef frac (*Op)(frac, frac); 5 6frac add(frac a, frac b) { return (frac){ a.n*b.d + b.n*a.d, a.d*b.d }; } 7frac sub(frac a, frac b) { return (frac){ a.n*b.d - b.n*a.d, a.d*b.d }; } 8frac mul(frac a, frac b) { return (frac){ a.n*b.n, a.d*b.d }; } 9frac div(frac a, frac b) { return (frac){ a.n*b.d, a.d*b.n }; } 10 11Op o[] = { add, sub, mul, div }; 12char* op_str[] = { "+", "-", "×", "÷" }; 13 14int is10(frac x) { return x.n == x.d * 10; } 15 16int main() 17{ 18 char str[256]; 19 printf("4桁の数字を入力してください。\n"); 20 scanf("%255s", str); // scanf_s("%s", str, 256); 21 printf("入力値は「%s」です。\n", str); 22 23 frac a = { str[0] - '0', 1 }; 24 frac b = { str[1] - '0', 1 }; 25 frac c = { str[2] - '0', 1 }; 26 frac d = { str[3] - '0', 1 }; 27 28 for (int i = 0; i < 4; i++) 29 for (int j = 0; j < 4; j++) 30 for (int k = 0; k < 4; k++) { 31 if (is10(o[j](o[i](a, b), o[k](c, d)))) // (a+b)+(c+d) 32 printf("(%c %s %c) %s (%c %s %c)\n", str[0], op_str[i], 33 str[1], op_str[j], str[2], op_str[k], str[3]); 34 if (is10(o[k](o[j](o[i](a, b), c),d))) // {(a+b)+c}+d 35 printf("{(%c %s %c) %s %c} %s %c\n", str[0], op_str[i], 36 str[1], op_str[j], str[2], op_str[k], str[3]); 37 if (is10(o[i](a, o[j](b, o[k](c, d))))) // a+{b+(c+d)} 38 printf("%c %s {%c %s (%c %s %c)}\n", str[0], op_str[i], 39 str[1], op_str[j], str[2], op_str[k], str[3]); 40 if (is10(o[k](o[i](a, o[j](b, c)), d))) // {a+(b+c)}+d 41 printf("{%c %s (%c %s %c)} %s %c\n", str[0], op_str[i], 42 str[1], op_str[j], str[2], op_str[k], str[3]); 43 if (is10(o[i](a, o[k](o[j](b, c), d)))) // a+{(b+c)+d} 44 printf("%c %s {(%c %s %c) %s %c}\n", str[0], op_str[i], 45 str[1], op_str[j], str[2], op_str[k], str[3]); 46 } 47}

投稿2022/01/10 08:33

編集2022/01/12 06:27
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

floatdouble は浮動小数点という内部表現を持っていて、二進数表現であることにかわりありません。 たとえば 1÷5 、つまり 0.2 という数値を二進数で表現すると 0.001100110011001100110011001100110011001100110011001101 (実際には無限に繰り返される循環小数) というようになってしまい、正確な値を表現できません。

質問の事例のような場合には有理数であることは確実なのですから、分母・分子を組にして分数として表現するのが妥当であると考えられます。

投稿2022/01/10 07:54

SaitoAtsushi

総合スコア5437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

kazuma-s さんの回答コードを拝借して計算部分を纏め。(意味無さそう。)

c

1#include <stdio.h> 2 3typedef struct { int n, d; } frac; 4typedef frac (*Op)(frac, frac); 5 6frac add(frac a, frac b) { return (frac){ a.n*b.d + b.n*a.d, a.d*b.d }; } 7frac sub(frac a, frac b) { return (frac){ a.n*b.d - b.n*a.d, a.d*b.d }; } 8frac mul(frac a, frac b) { return (frac){ a.n*b.n, a.d*b.d }; } 9frac div(frac a, frac b) { return (frac){ a.n*b.d, a.d*b.n }; } 10 11Op o[] = { add, sub, mul, div }; 12char* op_str[] = { "+", "-", "×", "÷" }; 13 14int is10(frac x) { return x.n == x.d * 10; } 15 16typedef frac (*Calc)(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d); 17typedef struct { Calc calc; char *fmt; } ptn; 18 19frac calc1(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d) { return oj(oi(a, b), ok(c, d)); }// (a+b)+(c+d) 20frac calc2(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d) { return ok(oj(oi(a, b), c),d); }// {(a+b)+c}+d 21frac calc3(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d) { return oi(a, oj(b, ok(c, d))); }// a+{b+(c+d)} 22frac calc4(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d) { return ok(oi(a, oj(b, c)), d); }// {a+(b+c)}+d 23frac calc5(frac a, Op oi, frac b, Op oj, frac c, Op ok, frac d) { return oi(a, ok(oj(b, c), d)); }// a+{(b+c)+d} 24 25ptn p[] = { 26 { calc1, "(%c %s %c) %s (%c %s %c)" }, 27 { calc2, "{(%c %s %c) %s %c} %s %c" }, 28 { calc3, "%c %s {%c %s (%c %s %c)}" }, 29 { calc4, "{%c %s (%c %s %c)} %s %c" }, 30 { calc5, "%c %s {(%c %s %c) %s %c}" } 31}; 32 33int main() { 34 char str[256]; 35 printf("4桁の数字を入力してください。\n"); 36 scanf("%s", str); 37 printf("入力値は「%s」です。\n", str); 38 39 frac a = { str[0] - '0', 1 }; 40 frac b = { str[1] - '0', 1 }; 41 frac c = { str[2] - '0', 1 }; 42 frac d = { str[3] - '0', 1 }; 43 44 for(int n=0, m, i, j, k; n<4*4*4*5; n++) { 45 m=n%5; i=(n/(5))%4; j=(n/(5*4))%4; k=n/(5*4*4)%4; 46 if(is10(p[m].calc(a, o[i], b, o[j], c, o[k], d))) { 47 printf(p[m].fmt, str[0], op_str[i], str[1], op_str[j], str[2], op_str[k], str[3]); 48 printf("\n"); 49 } 50 } 51}

投稿2022/01/11 08:37

jimbe

総合スコア12543

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問