• ベストアンサー

C言語で四則演算を使って結果が10になる数式

C言語のプログラミングについて質問です。 四つの一桁の数字を入力して四則演算を使って結果が10になる数式を作りたいのですが、イメージが湧きません。 教えていただけますか? 例:1234enterkey 答え2*3+1*4 数値の変数はint型でお願いします。int型ですので小数点以下を使って10になる結果は出さなくて宜しいです。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

No.3です。 No.2さんの方針でいかれるのであれば、重要なのは組み合わせを処理する部分ですよね。 例えば演算子の組み合わせは以下のように表現できますよね。 int main(void) { char *ops = "+-*/"; int i,j,k; for(i=0; i<4; i++) for(j=0; j<4; j++) for(k=0; k<4; k++) printf("%c %c %c\n", ops[i], ops[j], ops[k]); } 4つの数値の配置パターンは以下のように書けます。 このロジックは正攻法じゃなくてダサいです。 ネットにはもっといいコードが転がってますんで、 そちらも参考にしてください。 int main(int argc, char *argv[]) { char *nums = argv[1]; int i,j,k,l; for(i=0; i<4; i++) nums[i] -= '0'; for(i=0; i<4; i++){ for(j=0; j<4; j++){ if(i == j) continue; for(k=0; k<4; k++){ if(i == k) continue; if(j == k) continue; for(l=0; l<4; l++){ if(i == l) continue; if(j == l) continue; if(k == l) continue; printf("%d %d %d %d\n", nums[i], nums[j], nums[k], nums[l]); } } } } } C言語では数式を動的に作っても、直接解を得ることができません。 なので、前者のループは今回使わずに力技で処理するのがいいかと思いまして、 力技部分の処理を提示しました。 これで要素としては出揃ったと思います。 そういえば、除算をintでやっちゃってるんで、昨日のコードはちょっと 修正が必要ですね。 頑張ってください。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

もし力技で解くなら、力技部分はこんなプログラムになるでしょうね。 (雰囲気を伝えるものであって、こうしろって意味じゃないです) if(a+b+c+d == 10) printf("%d+%d+%d+%d\n", a, b, c, d); else if(a+b+c-d == 10) printf("%d+%d+%d-%d\n", a, b, c, d); else if(a+b+c*d == 10) printf("%d+%d+%d*%d\n", a, b, c, d); else if(a+b+c/d == 10) printf("%d+%d+%d/%d\n", a, b, c, d); else if(a+b-c+d == 10) printf("%d+%d-%d+%d\n", a, b, c, d); else if(a+b-c-d == 10) printf("%d+%d-%d-%d\n", a, b, c, d); else if(a+b-c*d == 10) printf("%d+%d-%d*%d\n", a, b, c, d); else if(a+b-c/d == 10) printf("%d+%d-%d/%d\n", a, b, c, d); else if(a+b*c+d == 10) printf("%d+%d*%d+%d\n", a, b, c, d); else if(a+b*c-d == 10) printf("%d+%d*%d-%d\n", a, b, c, d); else if(a+b*c*d == 10) printf("%d+%d*%d*%d\n", a, b, c, d); else if(a+b*c/d == 10) printf("%d+%d*%d/%d\n", a, b, c, d); else if(a+b/c+d == 10) printf("%d+%d/%d+%d\n", a, b, c, d); else if(a+b/c-d == 10) printf("%d+%d/%d-%d\n", a, b, c, d); else if(a+b/c*d == 10) printf("%d+%d/%d*%d\n", a, b, c, d); else if(a+b/c/d == 10) printf("%d+%d/%d/%d\n", a, b, c, d); else if(a-b+c+d == 10) printf("%d-%d+%d+%d\n", a, b, c, d); else if(a-b+c-d == 10) printf("%d-%d+%d-%d\n", a, b, c, d); else if(a-b+c*d == 10) printf("%d-%d+%d*%d\n", a, b, c, d); else if(a-b+c/d == 10) printf("%d-%d+%d/%d\n", a, b, c, d); else if(a-b-c+d == 10) printf("%d-%d-%d+%d\n", a, b, c, d); else if(a-b-c-d == 10) printf("%d-%d-%d-%d\n", a, b, c, d); else if(a-b-c*d == 10) printf("%d-%d-%d*%d\n", a, b, c, d); else if(a-b-c/d == 10) printf("%d-%d-%d/%d\n", a, b, c, d); else if(a-b*c+d == 10) printf("%d-%d*%d+%d\n", a, b, c, d); else if(a-b*c-d == 10) printf("%d-%d*%d-%d\n", a, b, c, d); else if(a-b*c*d == 10) printf("%d-%d*%d*%d\n", a, b, c, d); else if(a-b*c/d == 10) printf("%d-%d*%d/%d\n", a, b, c, d); else if(a-b/c+d == 10) printf("%d-%d/%d+%d\n", a, b, c, d); else if(a-b/c-d == 10) printf("%d-%d/%d-%d\n", a, b, c, d); else if(a-b/c*d == 10) printf("%d-%d/%d*%d\n", a, b, c, d); else if(a-b/c/d == 10) printf("%d-%d/%d/%d\n", a, b, c, d); else if(a*b+c+d == 10) printf("%d*%d+%d+%d\n", a, b, c, d); else if(a*b+c-d == 10) printf("%d*%d+%d-%d\n", a, b, c, d); else if(a*b+c*d == 10) printf("%d*%d+%d*%d\n", a, b, c, d); else if(a*b+c/d == 10) printf("%d*%d+%d/%d\n", a, b, c, d); else if(a*b-c+d == 10) printf("%d*%d-%d+%d\n", a, b, c, d); else if(a*b-c-d == 10) printf("%d*%d-%d-%d\n", a, b, c, d); else if(a*b-c*d == 10) printf("%d*%d-%d*%d\n", a, b, c, d); else if(a*b-c/d == 10) printf("%d*%d-%d/%d\n", a, b, c, d); else if(a*b*c+d == 10) printf("%d*%d*%d+%d\n", a, b, c, d); else if(a*b*c-d == 10) printf("%d*%d*%d-%d\n", a, b, c, d); else if(a*b*c*d == 10) printf("%d*%d*%d*%d\n", a, b, c, d); else if(a*b*c/d == 10) printf("%d*%d*%d/%d\n", a, b, c, d); else if(a*b/c+d == 10) printf("%d*%d/%d+%d\n", a, b, c, d); else if(a*b/c-d == 10) printf("%d*%d/%d-%d\n", a, b, c, d); else if(a*b/c*d == 10) printf("%d*%d/%d*%d\n", a, b, c, d); else if(a*b/c/d == 10) printf("%d*%d/%d/%d\n", a, b, c, d); else if(a/b+c+d == 10) printf("%d/%d+%d+%d\n", a, b, c, d); else if(a/b+c-d == 10) printf("%d/%d+%d-%d\n", a, b, c, d); else if(a/b+c*d == 10) printf("%d/%d+%d*%d\n", a, b, c, d); else if(a/b+c/d == 10) printf("%d/%d+%d/%d\n", a, b, c, d); else if(a/b-c+d == 10) printf("%d/%d-%d+%d\n", a, b, c, d); else if(a/b-c-d == 10) printf("%d/%d-%d-%d\n", a, b, c, d); else if(a/b-c*d == 10) printf("%d/%d-%d*%d\n", a, b, c, d); else if(a/b-c/d == 10) printf("%d/%d-%d/%d\n", a, b, c, d); else if(a/b*c+d == 10) printf("%d/%d*%d+%d\n", a, b, c, d); else if(a/b*c-d == 10) printf("%d/%d*%d-%d\n", a, b, c, d); else if(a/b*c*d == 10) printf("%d/%d*%d*%d\n", a, b, c, d); else if(a/b*c/d == 10) printf("%d/%d*%d/%d\n", a, b, c, d); else if(a/b/c+d == 10) printf("%d/%d/%d+%d\n", a, b, c, d); else if(a/b/c-d == 10) printf("%d/%d/%d-%d\n", a, b, c, d); else if(a/b/c*d == 10) printf("%d/%d/%d*%d\n", a, b, c, d); else if(a/b/c/d == 10) printf("%d/%d/%d/%d\n", a, b, c, d); ちなみに手元では完成してますが、面白いですねこれ。 組み方によっては別解全部表示できますし。 iPhoneアプリとかであったら嬉しいかも。

dezaemon1120
質問者

補足

値を取り出すまではできました。 以下のプログラム文に結果が10になる四則演算を表示させるとしたらどのように追加したらよろしいですか? たしか小町演算というのを使うらしいですが、使い方がわかりません。 for文がいくつも連続してるらしいですが。 #include<stdio.h> int main(void) { char num[10]; int val[4]; int i; printf("式:"); scanf("%s",num); for(i=0;i<4;i++){ val[i] = 0; } for(i=0; i<4; i++){ if((num[i] >= '1') && (num[i] <= '9')){/*1から9の数値が入ったならば*/ val[i] = num[i]-'0'; } } for(i=0; i<4; i++){ printf("答え%d:%d\n",i,val[i]); } return 0; }

すると、全ての回答が全文表示されます。
  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.2

何も考えずに総当りするのが簡単です。 数字の重複がないと仮定して、入力された4つの数字を並べる組合せは4×3×2×1=24通り。 4つの演算子を並べる組合せは4×4×4=64通り。 それぞれを組み合わせれば、できあがる計算式はたったの1,536通りです。 その中から計算して10になる計算式を探すだけ。 ( )を使わないという前提での話ですけどね。

dezaemon1120
質問者

補足

for文をかなり多く使っていると思うのですが、数値の数に対していくつ必要ですか? あと、並び替えるのも考慮したらどのように作ったらよろしいですか?質問ばかりで申し訳ありません。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その例の場合に, どのようにして入力から答えを得たのですか?

すると、全ての回答が全文表示されます。

関連するQ&A