dポイントプレゼントキャンペーン実施中!

/ SEND それぞれのアルファベットには独立した数字 (0~9) のときその組み合わせは?
// +MORE
//--------
// MONEY

#include <stdio.h>

int check (int send, int more, int money) {

int s, e1, n1, d, m1, o1, r, e2, m2, o2, n2, e3, y, flag;

flag = 0;

s=send/1000; e1=(send / 100) %10;
// sendが1234
n1=(send / 10) %10; d= send %10;

m1 = more / 1000; o1 = (more / 100) % 10;
r =(more / 10) %10; e2 = more %10;

m2 = money / 10000; o2 = (money / 1000) % 10;
n2 = money / 100 % 10; e3 = money / 10 % 10;
y = money % 10;

if((e1 == e2) && (e2 == e3) && (n1 == n2) && (m1 == m2) && (o1 == o2)) flag =1;

if((s ==e1) || (s == n1) || (s == d) ||
(s == m1) || (s == o1) || (s == r) || (s == e2) ||
(s == m2) || (s == o2) || (s == n2) || (s == e3) || (s == y)) flag = 0;

if ((d == s) || (d == e1) || (d == n1) ||
(d == m1) || (d == o1) || (d == r) || (d == e2) ||
(d == m2) || (d == o2) || (d == n2) || (d == e3) || (d == y)) flag = 0;

if ((r == s) || (r == e1) || (r == n1) || (r == d) ||
(r == m1) || (r == o1) || (r == e2) ||
(r == m2) || (r == o2) || (r == n2) || (r == e3) || (r == y)) flag = 0;

if ((y == s) || (y == e1) || (y == n1) || (y == d) ||
(y == m1) || (y == o1) || (y == r) || (y == e2) ||
(y == m2) || (y == o2) || (y == n2) || (y == e3)) flag = 0;


return flag;
}

main () {

int send , more, money, count;
count = 0;
for (send =1000; send <9999; send++) {
for (more =1000; more <9999; more++) {
money = send + more;

if(check(send, more, money)==1) {
count++;
printf ("NO. %d\n", count);
printf(" %d \n",send);
printf("+ %d \n",more);
printf(" %d\n",money);
}
}
}
}
覆面算のプログラム何ですけど
1000から9999までを全て計算して25個実行するのですが
どうif文の条件を厳しくして追加していいのか分かりません
実行結果
NO. 1
2817
+ 368
3185
NO. 2
2819
+ 368
3187
NO. 3
3712
+ 467
4179
NO. 4
3719
+ 457
4176
NO. 5
3821
+ 468
4289
NO. 6
3829
+ 458
4287
NO. 7
5731
+ 647
6378
NO. 8
5732
+ 647
6379
NO. 9
5849
+ 638
6487
NO. 10
6415
+ 734
7149
NO. 11
6419
+ 724
7143
NO. 12
6524
+ 735
7259
NO. 13
6851
+ 738
7589
NO. 14
6853
+ 728
7581
NO. 15
7316
+ 823
8139
NO. 16
7429
+ 814
8243
NO. 17
7531
+ 825
8356
NO. 18
7534
+ 825
8359
NO. 19
7539
+ 815
8354
NO. 20
7643
+ 826
8469
NO. 21
7649
+ 816
8465
NO. 22
8324
+ 913
9237
NO. 23
8432
+ 914
9346
NO. 24
8542
+ 915
9457
NO. 25
9567
+1085
10652
この実行結果を出したいのですが分かる方いたら教えて下さい

A 回答 (2件)

// SEND それぞれのアルファベットには独立した数字 (0~9) のときその組み合わせは?


// +MORE
//--------
// MONEY

このコメントが付いて、ようやく何をしようとしているのかが理解できました。

> 1000から9999までを全て計算して25個実行する

というのも意味不明だったのですが、「25個解が見つかる(本当はそんなに無いはず)」という意味だとわかりました。


まず、覆面算では、「最高位は0ではない」というルールがあるそうです。
そのルールを採用するなら「NO. 1:2817+ 368=3185」 等はM=0なのでルール違反です。

ただ、現状のプログラムでは、1000〜9998 (9999ではありません) を総当たりしているので、このルールを適用したものになっています。


次に、check 関数で何をやっているか見ていきます。

正解となるのは
(1)同じ文字には同じ数字
(2)違う文字には違う数字
を満すときです。

(1)をチェックしているのが
if((e1 == e2) && (e2 == e3) && (n1 == n2) && (m1 == m2) && (o1 == o2)) flag =1;
です。コメントを付けるなら
/* 同じ文字が同じ数字になっていれば、正解の可能性がある(flag=1) */
とでもなるでしょうか。

(2)をやっているのが、その下の部分です。
/* Sと他の文字とで等しいものがあったら不正解(flag=0) */
if((s ==e1) || (s == n1) || (s == d) ||
(s == m1) || (s == o1) || (s == r) || (s == e2) ||
(s == m2) || (s == o2) || (s == n2) || (s == e3) || (s == y)) flag = 0;

以下、同様のコメントを付けていくと、チェックしてない文字があることがわかります。
そのチェックを追加しましょう。




で、抜けているの文字のことを考えると、そのままコピペして
if((e1 ==s) || (e1 == n1) || (e1 == d) ||
(e1 == m1) || (e1 == o1) || (e1 == r) || (e1 == e2) ||
(e1 == m2) || (e1 == o2) || (e1 == n2) || (e1 == e3) || (e1 == y)) flag = 0;
とかやって、「答えが一つも見つからない」とでも思ったのでは?
論理和なので、どれか一つでも成立していれば、flag=0になります。
この中には (e1 == e2) があります。 このとき「不正解」とするのが「正しい」動作なのか、考えてみましょう。


少し工夫すると、無駄な判定が無くなってスッキリするのですが、今回は、提示されてプログラムをなるべく変えない方針で答えました。
    • good
    • 0

表示の順番はご提示のものと異なります。


-----------------------------------------------
#include <stdio.h>


int get_send(int s,int e,int n,int d){
return s*1000+e*100+n*10+d;
}
int get_more(int m,int o,int r,int e){
return m*1000+o*100+r*10+e;
}
int get_money(int m,int o,int n,int e,int y){
return m*10000+o*1000+n*100+e*10+y;
}


int main(int argc, char *argv[]){

int d,e,m,n,o,r,s,y;
int flag[10] = {0,0,0,0,0,0,0,0,0,0};
int money,send,more;
int i = 1;

for(d = 0; d < 10; d++){
flag[d] = 1;
for(e = 0; e < 10; e++){
if(flag[e] == 1) continue;
flag[e] = 1;
for(m = 0; m < 10; m++){
if(flag[m] == 1) continue;
flag[m] = 1;
for(n = 0; n < 10; n++){
if(flag[n] == 1) continue;
flag[n] = 1;
for(o = 0; o < 10; o++){
if(flag[o] == 1) continue;
flag[o] = 1;
for(r = 0; r < 10; r++){
if(flag[r] == 1) continue;
flag[r] = 1;
for(s = 0; s < 10; s++){
if(flag[s] == 1) continue;
flag[s] = 1;
for(y = 0; y < 10; y++){
if(flag[y] == 1) continue;
send = get_send(s,e,n,d);
more = get_more(m,o,r,e);
money = get_money(m,o,n,e,y);
if(send + more == money){
printf("No.%2d\n", i);
i++;
printf("send %5d\n", send);
printf("more + %5d\n", more);
printf(" -----\n");
printf("money %5d\n", money);
printf("\n");
}
}
flag[s] = 0;
}
flag[r] = 0;
}
flag[o] = 0;
}
flag[n] = 0;
}
flag[m] = 0;
}
flag[e] = 0;
}
flag[d] = 0;
}
return 0;
}
    • good
    • 0

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