0

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

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

“在密码谜题中,数学方程式是用字母写的。每个字母可以是从 0 到 9 的数字,但没有两个字母可以相同。这是一个示例问题:SEND + MORE = MONEY 谜题的解决方案是 S = 9,R = 8,O = 0,M = 1,Y = 2,E = 5,N = 6,D = 7。编写一个程序,找到以下密码难题的解决方案: TOO + TOO + TOO + TOO = GOOD 最简单的技术是对每个唯一字母(在本例中为 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 循环中以控制所有内容,这是我修复的众多尝试之一。它(根本)不起作用,所以我将其注释掉。

4

2 回答 2

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
            }
        }
    }
}
于 2013-07-27T02:08:54.617 回答
0

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

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

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

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

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

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

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

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

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);
于 2014-01-10T08:09:21.127 回答