
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でやっちゃってるんで、昨日のコードはちょっと
修正が必要ですね。
頑張ってください。
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アプリとかであったら嬉しいかも。
この回答への補足
値を取り出すまではできました。
以下のプログラム文に結果が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;
}
No.2
- 回答日時:
何も考えずに総当りするのが簡単です。
数字の重複がないと仮定して、入力された4つの数字を並べる組合せは4×3×2×1=24通り。
4つの演算子を並べる組合せは4×4×4=64通り。
それぞれを組み合わせれば、できあがる計算式はたったの1,536通りです。
その中から計算して10になる計算式を探すだけ。
( )を使わないという前提での話ですけどね。
この回答への補足
for文をかなり多く使っていると思うのですが、数値の数に対していくつ必要ですか?
あと、並び替えるのも考慮したらどのように作ったらよろしいですか?質問ばかりで申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- その他(プログラミング・Web制作) プログラミングって本来数学的な計算をする為のものではないのですか? 学校で配られたFortran90 11 2022/08/25 22:14
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報