2013-07-27 3 views
0

편집 : 이제는 내 프로그램이 작동하지만 "else if (400 * T + 40 * O + 4 * O == 1000 * G + 100 * O + 10 * O + D) "퍼즐을 푸는 열쇠입니다. 프로그램의 모든 부분을 완전히 이해하고 싶습니다. 감사합니다.간단한 암호 해독 퍼즐을 해결하기위한 Java 프로그램

이것은 검토 목적으로 만 사용되었으며, 몇 시간을 알아 내려고 노력했습니다. 나는 변수에 대해 모두 0을 얻거나 무한 루프입니다. 이 책에 쓰여있는 질문은 다음과 같습니다.

"암호 연산 퍼즐에서 수학 공식은 문자를 사용하여 작성됩니다. 각 문자는 0부터 9까지의 숫자 일 수 있지만 두 글자는 같을 수 없습니다. 샘플 문제 : SEND + MORE = 돈 퍼즐에 대한 해결책은 S = 9, R = 8, O = 0, M = 1, Y = 2, E = 5, N = 6, D = 7입니다. TOO + TOO + TOO = GOOD 가장 간단한 방법은 각 고유 문자 (이 경우 T, O, G, D)에 대해 중첩 루프를 사용하는 것입니다. 루프는 체계적으로 각 문자에 0에서 9까지의 숫자를 할당합니다. 예를 들어, T는 0, O는 0, G는 0, D는 0, 0은 0, O는 0, G는 0, D는 1, T = 9, O = 9까지 T = 0, O = 0, G = 0, D = 2 등 , 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); 
          } 
         } 
        } 
       }  
      } 
     //} 
    } 
} 

당신이 볼 수 있듯이, 나는 모든. 그것은 didn를 해결하기 위해 나의 많은 시도의 하나로서 모든 것을 제어하는 ​​while 루프에서 루프에 대한 넣어 시도 ... '는 t가 (전혀) 작동, 그래서 그것을 주석

답변

0

>의 모든 <의해야 당신은 < 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 감사합니다! 그것은 트릭을 수행하고 continue 문을 삭제하고 빈 if body 문을 가질 수있었습니다. 내가 만든 그러한 멍청한 실수는 잡았어야했는데, 나는 그 권리를 당하고 다른 곳에서 버그를 찾았다. 또한 누구나 "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'를주는 십 자리수와 1 자리수라는 것을 의미합니다. 실제로는 너무 많으므로 4를 곱하면됩니다. TOO + TOO + TOO + TOO'는 왼편에서 원했던 것입니다. 오른손은 비슷하게 따른다. –

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