Cryptarithmetic puzzle 简单密码难题

Cryptarithmetic puzzle 简单密码难题,cryptarithmetic-puzzle,Cryptarithmetic Puzzle,我正在寻找一种方法来解决这个密码算法问题: ROBERT + GERALD = DONALD 还有其他一些,每个字母代表一个数字 您将如何着手手动解决此问题,以及这与以编程方式解决此问题有何关系 提前谢谢你你可以算出一个总数: robert + gerald ------ = donald 并运用基本的数学知识 例如,右列(6)中没有进位,我们有T+D=D。这意味着T必须为零 同样,对于第5列,第6列没有进位,R+L=L表示R也为零,第4列也没有进位 与第4列相同,E+A=A因此

我正在寻找一种方法来解决这个密码算法问题:

ROBERT +  GERALD =  DONALD
还有其他一些,每个字母代表一个数字

您将如何着手手动解决此问题,以及这与以编程方式解决此问题有何关系


提前谢谢你

你可以算出一个总数:

  robert
+ gerald
  ------
= donald
并运用基本的数学知识

例如,右列(6)中没有进位,我们有
T+D=D
。这意味着
T
必须为零

同样,对于第5列,第6列没有进位,
R+L=L
表示
R
也为零,第4列也没有进位

与第4列相同,
E+A=A
因此
E
为零

因此,我们现在有:

  0ob000
+ g00ald
  ------
= donald
从这里,我们可以从第3列和第1列中推断出
b==n
g==d
,它们(连同
o/a/l/d
)可以是任何值,因为每个数字都被加为零,所以不可能带任何位置。所以,让我们把它们都变成一个:

  011000
+ 100111
  ------
= 111111
事实上,您可以将它们全部设为零,最终得到
000000+000000=000000

但这几乎与编程无关,所以让我们这样做:

#include <stdio.h>
int main (void) {
 int robert, gerald, donald;
 for (int r = 0; r < 10; r++) {
  for (int o = 0; o < 10; o++) {
   for (int b = 0; b < 10; b++) {
    for (int e = 0; e < 10; e++) {
     for (int t = 0; t < 10; t++) {
      for (int g = 0; g < 10; g++) {
       for (int a = 0; a < 10; a++) {
        for (int l = 0; l < 10; l++) {
         for (int d = 0; d < 10; d++) {
          for (int n = 0; n < 10; n++) {
           robert = r * 100000 + o * 10000 + b * 1000 + e * 100 + r * 10 + t;
           gerald = g * 100000 + e * 10000 + r * 1000 + a * 100 + l * 10 + d;
           donald = d * 100000 + o * 10000 + n * 1000 + a * 100 + l * 10 + d;
           if (robert + gerald == donald) {
            printf ("  %06d\n", robert);
            printf ("+ %06d\n", gerald);
            printf ("  ------\n");
            printf ("= %06d\n", donald);
            printf ("........\n");
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }
 return 0;
}
它没有输出解决方案

现在,这是一个不同的问题,但您只需稍微修改上面的代码,将
if
语句改为:

if (donald + gerald == robert) {
 printf ("  %06d\n", donald);
 printf ("+ %06d\n", gerald);
 printf ("  ------\n");
 printf ("= %06d\n", robert);
 printf ("........\n");
}
您可以得到单一的解决方案:

  526485
+ 197485
  ------
= 723970

它更适合于数学se站点,因为这是一个简单的密码谜题。。不管怎么说,看看这个好!(+1)我想说的是,那些嵌套的for循环只需要一个接收函数,它也可以解决任何问题。《新科学家》杂志每周都有一个谜。我经常用它来保持我的注意力集中,找出用程序解决问题的最佳方法。代码往往是一次性的,所以我不太担心可重用性:-)谢谢,这肯定消除了我所有的疑虑。
  526485
+ 197485
  ------
= 723970