2013-07-27 52 views
0

編輯:我得到了我的程序現在工作,但仍需要一些澄清的「其他如果(400 * T + 40 * O + 4 * O == 1000 * G + 100 * O + 10 * O + D)「是解決這個難題的關鍵。我只是想完全理解程序的每一點,謝謝。Java程序來解決簡單的加密算法難題

這僅用於審查目的,我花了幾個小時試圖弄清楚。我要麼爲變量獲得全零,要麼是無限循環。這是一個問題,因爲它寫在書中:

「在cryptarithmetic puzzles中,數學方程是用字母寫的,每個字母可以是一個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的數字分配給每個字母。例如,itmightfirsttryT = 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); 
          } 
         } 
        } 
       }  
      } 
     //} 
    } 
} 

正如你所看到的,我試圖把所有的在一個while循環來控制一切,我多次嘗試解決的一個。它沒循環。「T工作(所有),所以我評論它

回答

0
所有這些 > 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 
      } 
     } 
    } 
} 
+0

@ Dennis Meng謝謝!這樣做的竅門,並能夠放棄繼續聲明,只是有一個空的機構,如果聲明。我犯了這樣一個愚蠢的錯誤,應該抓住這個錯誤,但我認爲那些錯誤並且在其他地方尋找錯誤。另外,任何人都在意進一步解釋「else if(400 * T + 40 * O + 4 * O == 1000 * G + 100 * O + 10 * O + D)」?再次,謝謝。 – novice9

+0

它發生了。很高興我能幫上忙。 –

+0

'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'你想要在左邊。右側同樣遵循。 –

0

恩,我是新來的,一般來說編程是新手。但是我也在使用絕對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);