/ 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件)
- 最新から表示
- 回答順に表示
No.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) があります。 このとき「不正解」とするのが「正しい」動作なのか、考えてみましょう。
少し工夫すると、無駄な判定が無くなってスッキリするのですが、今回は、提示されてプログラムをなるべく変えない方針で答えました。
No.1
- 回答日時:
表示の順番はご提示のものと異なります。
-----------------------------------------------
#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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ボランティア ウクライナ人からどういうこと? 6 2022/03/28 07:37
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
- 英語 no more than で言い換えられますか? 2 2023/06/26 22:58
- 英語 クジラ構文 3 2022/12/23 11:36
- 戦争・テロ・デモ ウクライナ、メル友に五千円要求されてさ 1 2022/04/02 09:38
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- UNIX・Linux Linuxの実行結果を修正したいです。 2 2022/11/23 08:32
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- 英語 不定詞 1 2023/03/12 01:48
- 戦争・テロ・デモ ウクライナ人から 3 2023/03/05 07:25
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
課題でつまってます・・・
-
複数桁10進数の*桁目だけを抽出...
-
数字列を3桁ごとにカンマで区切...
-
配列v2を逆順にしてv1に格納す...
-
double型の値を、一桁ずつint型...
-
C言語の配列をC++のvectorに高...
-
if と配列の組み合わせ
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
このプログラミング誰か教えて...
-
Win32APIで作るコンボボックス...
-
卒業研究でよく分からないとこ...
-
C#のコンパイルエラーCS0120に...
-
C言語についてです。
-
c言語の配列を使ってサイコロを...
-
(int *)の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報