アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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でやっちゃってるんで、昨日のコードはちょっと
修正が必要ですね。

頑張ってください。
    • good
    • 0

もし力技で解くなら、力技部分はこんなプログラムになるでしょうね。


(雰囲気を伝えるものであって、こうしろって意味じゃないです)

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;
}

補足日時:2011/07/26 17:21
    • good
    • 0

何も考えずに総当りするのが簡単です。



数字の重複がないと仮定して、入力された4つの数字を並べる組合せは4×3×2×1=24通り。
4つの演算子を並べる組合せは4×4×4=64通り。
それぞれを組み合わせれば、できあがる計算式はたったの1,536通りです。
その中から計算して10になる計算式を探すだけ。

( )を使わないという前提での話ですけどね。

この回答への補足

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

補足日時:2011/07/26 19:46
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!