覆面算のプログラムがわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
フィリップ

覆面算のプログラムがわかりません

#1

投稿記事 by フィリップ » 9年前

1000から9999までのパターンを計算して25個実行結果を表示させるプログラムに修正したいのですが
分かる方いたら教えて下さい

コード:

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

かずま

Re: 覆面算のプログラムがわかりません

#2

投稿記事 by かずま » 9年前

フィリップ さんが書きました:1000から9999までのパターンを計算して25個実行結果を表示させるプログラムに修正したいのですが
m = 0 でよければ 25個になりますが、そうでなければ最後の 1個だけでは?

コード:

send + more = money
2817 + 0368 = 03185
2819 + 0368 = 03187
3712 + 0467 = 04179
3719 + 0457 = 04176
3821 + 0468 = 04289
3829 + 0458 = 04287
5731 + 0647 = 06378
5732 + 0647 = 06379
5849 + 0638 = 06487
6415 + 0734 = 07149
6419 + 0724 = 07143
6524 + 0735 = 07259
6851 + 0738 = 07589
6853 + 0728 = 07581
7316 + 0823 = 08139
7429 + 0814 = 08243
7531 + 0825 = 08356
7534 + 0825 = 08359
7539 + 0815 = 08354
7643 + 0826 = 08469
7649 + 0816 = 08465
8324 + 0913 = 09237
8432 + 0914 = 09346
8542 + 0915 = 09457
9567 + 1085 = 10652

コード:

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int &S = a[0], &E = a[1], &N = a[2], &D = a[3];
    int &M = a[4], &O = a[5], &R = a[6], &Y = a[7];
    cout.fill('0');
    do  {
        if (a[8] < a[9]) continue;
        int send = S*1000 + E*100 + N*10 + D;
        int more = M*1000 + O*100 + R*10 + E;
        int money = M*10000 + O*1000 + N*100 + E*10 + Y;
        if (send + more == money)
            cout << setw(4) << send << " + " << setw(4) << more
                 << " = " << setw(5) << money << endl;
    } while (next_permutation(a, a + 10));
}
if (M && a[8] < a[9]) continue; に変えれば 1個だけ。

かずま

Re: 覆面算のプログラムがわかりません

#3

投稿記事 by かずま » 9年前

かずま さんが書きました:if (M && a[8] < a[9]) continue; に変えれば 1個だけ。
訂正します。
if (M== 0 || a[8] < a[9]) continue; に変えれば 1個だけ。

かずま

Re: 覆面算のプログラムがわかりません

#4

投稿記事 by かずま » 9年前

元のプログラムのアルゴリズムを尊重した Cプログラムです。
check() でダメだと分かったらすぐに return しましょう。
全部の処理をやってからだと遅くなります。

コード:

#include <stdio.h>

int check(int send, int more, int money)
{
    int s, e, n, d, m, o, r, y, x;
 
    d = send % 10; send /= 10;
    n = send % 10; send /= 10; if (n==d) return 0;
    e = send % 10; send /= 10; if (e==n || e==d) return 0;
    s = send % 10;             if (s==e || s==n || s==d) return 0;

    x = more % 10; more /= 10; if (x != e) return 0;
    r = more % 10; more /= 10; if (r==s || r==e || r==n || r==d) return 0;
    o = more % 10; more /= 10; if (o==r || o==s || o==e || o==n || o==d) return 0;
    m = more % 10;     if (m==o || m==r || m==s || m==e || m==n || m==d) return 0;

    y = money % 10; money /= 10;
               if (y==m || y==o || y==r || y==s || y==e || y==n || y==d) return 0;
    x = money % 10; money /= 10; if (x != e) return 0;
    x = money % 10; money /= 10; if (x != n) return 0;
    x = money % 10; money /= 10; if (x != o) return 0;
    x = money % 10;              if (x != m) return 0;

    return 1;
}
 
int main(void)
{
    int send, more, money, count = 0;

       for (send = 123; send <= 9876; send++) {    // 0123 と書くと 8進数
          for (more = 123; more <= 9876; more++) {  // 1000からだと解はひとつ
            money = send + more;
            if (check(send, more, money))
                printf("%2d: %04d + %04d = %05d\n", ++count, send, more, money);
        }
    }
    return 0;
}
実行結果

コード:

 1: 2817 + 0368 = 03185
 2: 2819 + 0368 = 03187
 3: 3712 + 0467 = 04179
 4: 3719 + 0457 = 04176
 5: 3821 + 0468 = 04289
 6: 3829 + 0458 = 04287
 7: 5731 + 0647 = 06378
 8: 5732 + 0647 = 06379
 9: 5849 + 0638 = 06487
10: 6415 + 0734 = 07149
11: 6419 + 0724 = 07143
12: 6524 + 0735 = 07259
13: 6851 + 0738 = 07589
14: 6853 + 0728 = 07581
15: 7316 + 0823 = 08139
16: 7429 + 0814 = 08243
17: 7531 + 0825 = 08356
18: 7534 + 0825 = 08359
19: 7539 + 0815 = 08354
20: 7643 + 0826 = 08469
21: 7649 + 0816 = 08465
22: 8324 + 0913 = 09237
23: 8432 + 0914 = 09346
24: 8542 + 0915 = 09457
25: 9567 + 1085 = 10652

閉鎖

“C言語何でも質問掲示板” へ戻る