【问题标题】:Java program to solve simple cryptarithmetic puzzleJava程序解决简单的密码算术难题
【发布时间】:2013-07-27 00:55:01
【问题描述】:

编辑:我的程序现在可以运行了,但仍然需要对 else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D) 部分进行一些说明,这是解决难题的关键。我只是想完全了解程序的每一点,谢谢。

这仅用于审查目的,我花了几个小时试图弄清楚。我要么让变量全为零,要么是一个无限循环。这是书中所写的问题:

“在密码谜题中,数学方程是用字母写的。每个字母可以是从 0 到 9 的数字,但没有两个字母可以相同。这是一个示例问题: 发送 + 更多 = 金钱 谜题的解是 S = 9, R = 8, O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7。编写一个程序,找到解下列: 太 + 太 + 太 + 太 = 好 最简单的技术是对每个唯一字母(在本例中为 T、O、G、D)使用嵌套循环。循环会系统地为每个字母分配从 0 到 9 的数字。例如,它可能首先尝试 T = 0, O = 0, G = 0, D = 0 然后 T = 0, O = 0, G = 0, D = 1 然后 T = 0, O = 0, G = 0 , D = 2 等,直到 T = 9, O = 9, G = 9, D = 9。在循环体中,测试每个变量是唯一的并且满足方程。输出满足等式的字母的值。”

public class PracticeProjectEight
{
    public static void main(String[] args)
    {
        int T = 0 , O = 0 , G = 0 , D = 0;
        boolean keepGoing = true;
        //boolean againT = true , againO = true , againG = true , againD = true ;

        // while (keepGoing)   
        //{
            for (T = 0 ;  T > 10 ; T++)  
            {    
                for (O = 0 ; O > 10 ; O++)  
                {    
                    for (G = 0 ; G > 10 ; G++) 
                    {    
                        for (D = 0 ; D > 10 ; D++)
                        {    
                            if ((D == G) || (D == O) || (D == T) || (G == O) || (G == T) || (O == T))
                            {
                                //keepGoing = true;
                                continue;
                            }

                            else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D)
                            {      
                                //keepGoing = false;
                                System.out.println("T = " + T);
                                System.out.println("O = " + O);
                                System.out.println("G = " + G);
                                System.out.println("D = " + D);
                                System.exit(0);
                            }
                        }
                    }
                }      
            }
       //}
    }
}

如您所见,我尝试将所有 for 循环放在一个 while 循环中以控制一切,这是我修复的众多尝试之一。它(根本)不起作用,所以我将其注释掉。

【问题讨论】:

    标签: java cryptarithmetic-puzzle alphametic-question


    【解决方案1】:

    所有>s 都应该是<s。你想要< 10,而不是> 10

    换句话说,应该是:

    for (T = 0; T < 10; T++) {
        for (O = 0; O < 10; O++) { 
            for (G = 0; G < 10; G++) {
                for (D = 0; D < 10; D++) {
                    // your logic as before
                }
            }
        }
    }
    

    【讨论】:

    • @Dennis Meng 谢谢!这样就成功了,并且能够删除 continue 语句并且只有一个空的 if 语句。我犯了这样一个愚蠢的错误,应该抓住它,但我认为这些是对的,并在别处寻找错误。另外,有人愿意进一步解释“else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D)”吗?再次感谢。
    • 它发生了。很高兴我能帮上忙。
    • else if (400*T + 40*O + 4*O == 1000*G + 100*O + 10*O + D) 是实际看看它是否是一个解决方案。这里的“TOO”意味着T 是百位数字,O 是十位和个位数字,给你100*T + 10*O + O,你乘以4,因为它实际上是你想要在左边的TOO + TOO + TOO + TOO。右侧类似。
    【解决方案2】:

    嗯,我是新来的,对一般的编程也很陌生。但我也在使用 Absolute Java,刚刚解决了这个问题。

    我没有运行你的代码,但是乍一看,似乎有一些问题。

    (或者,也许我错了。你自己看看。我只会让你知道我在想什么。)

    首先,按照您的结构方式,它似乎无法让您发现问题的多种解决方案。当达到解决方案时,您告诉系统退出,不是吗?还是我误会了?

    其次,如果遇到两个变量对应于相同数字的解决方案,您告诉程序“继续”,但您没有告诉程序不要计算这些解决方案,我认为这就是请求的编程问题。

    第三,我什至不确定“继续前进”在扮演什么角色。循环的嵌套确保 - 我认为 - 在编码中的那个点实现/考虑所有可能性/排列,不是吗?那么这里的布尔条件有什么意义呢?

    我认为我在所有这些方面都偏离了基础。我只编程了 3 周。但这是我的代码(抱歉这么草率)。

    (另外,你会看到我在那里扔了一个“计数器”来计算失败的组合/分配。但在这方面我也可能会感到困惑。再次,抱歉,如果我的 cmets 离这里很远。)

    public static void main(String[] args) {
    
    int count = 0;
    
    for (int G = 0; G <=9; G++)   
    {
        for (int O = 0; O <=9; O++)
            for (int T = 0; T <=9; T++)
                for (int D = 0; D <=9; D++)
    
        if (((G != O) && (G != T) && (G != D) && 
                (O != T) && (O != D) && (T != D)) 
                && 
                ((400 *T) + (40 * O) + (4*O)) == 
                ((1000*G) + (100*O) + (10*O) + (1*D)))
        {
            System.out.println("G = " + G + "," + " O = " + O + "," + 
                    "T = " + T + "," + "D = " + D);
    
        }
        else count = count +1;    
    }
    System.out.println(count);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多