2014-01-30 35 views
0

我正在嘗試製作一個程序,可以分析用戶的兩位數字。我使用了一個Scanner對象來接受輸入,然後是一個數組組合。這是我的代碼:(如果用戶輸入56如)分析一個兩位數字並打印其個人數字的總和

class Calculate { 
    public static void calculate() { 
     Scanner br = new Scanner(System.in); 

     int[] c = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 
     int[] d = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 

     int sum; 
     int a = br.nextInt(); 
     System.out.println("Digit is:" + a); 

     for (int i = 0; i < 10; i++) { 
      int e = 0; 
      if (a == ((c[i] * 10) + d[e])) { 
       sum = ((c[i] * 10) + d[e]); 
       System.out.println("First digit is:" + c[i] 
         + " Second digit is:" + d[e] 
         + "\n" + "Sum of digits=" + sum); 
      } else if (i == 9) { 
       i = 0; 
       e++; 
      } else if (e == 10) { 
       System.out.println("INVALID NO. HAS BEEN DETECTED"); 
      } 
     } 
    } 
} 

我的預期輸出:

Digit is:56 
First Digit:5 Second digit:6 
Sum of digits=11 

但是,輸出不出來正常;它採取無限輸入。像這樣:

56 
Digit is:56 
23 
89 
45 
..... 

而這樣,它卡在一個循環。我該如何解決這個問題?

+0

嘗試把一個else語句在你的if/else樹,只是版畫「不應該到這裏來」或結束類似的東西。然後你知道你的邏輯不起作用。由於您稱之爲計算的方式,它可能需要無限輸入。你可以應該你的主要方法嗎?此外,你的循環非常混亂,你每次迭代都會重置'e',所以它永遠不會達到10.你最好不要改變'i'的值。 – turbo

+0

你必須使用數組嗎?或者你可以使用'a/10'和'%10'嗎? – Pshemo

+0

@ArunKumar有沒有必要把標題中的語言。在內部由代碼和谷歌等代表它被自動放入(谷歌標題看起來像「java - 分析一個兩位數字和打印其個人數字的總和 - java」 –

回答

3

而不是瘋狂的循環,如果你想獲得一個數字的第一個和第二個數字,使用這種技術。

int number = 457; 
int hundredsDigit = number % 1000 - number % 100; 
int tensDigit= number % 100 - number % 10 
int onesDigit = number % 10 - number % 1; 

你看到圖案了嗎?

+0

'數字%1'的目的是什麼? – jarnbjo

+0

@jarnbjo它可以幫助人們閱讀答案,看到的模式,當然,它總是爲零。這樣,您可以擴展模式,而不會創建一個數字的角落案例 – Rainbolt

+0

雅,得到了模式。雖然你的程序給出了地點值:P) – user3253946

0
Scanner br = new Scanner(System.in); 
int[] c = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 
int[] d = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 
int sum; 
int a = br.nextInt(); 
System.out.println("Digit is:" + a); 
if (a < 0 || a > 99) 
    System.out.println("INVALID NO. HAS BEEN DETECTED"); 
else 
    System.out.println("First digit is:" + a/10 + " " + "Second digit is:" + a % 10 + "\n" + "Sum of digits=" + (a/10 + a % 10)); 
+0

你也可以顯示輸出嗎?原因我仍然得到那個輸出 – user3253946

+0

這是輸出,輸入56: 數字是:56 第一位數字是: 5第二位是:6 位數總和= 11 – Mohammed

-1

這是另一種方式(只是爲了證明另一個possibilty):

String number = String.valueOf(a); 

    String firstNumber = number.substring(0, 1); 
    String secondNumber = number.substring(1); 

    sum = Integer.parseInt(firstNumber) + Integer.parseInt(secondNumber); 

,記得初始化總和,不僅其聲明:

int sum = 0; 

還記得關閉掃描儀br當你完成它的工作:

br.close; 
+0

它是不是特別聰明地使用'String.substring'來做微不足道的數學。 「 – jarnbjo

+0

」只是爲了表明另一種可能性「它不是錯誤的寫出來的...... – Hari

+0

如果他想要另一種乏味的可能性,當然可以在一張紙上打印數字,要求操作員剪掉單個數字,用OCR軟件掃描它們,然後添加數字。理論上可行的解決方案並不意味着你應該考慮使用它。 – jarnbjo

0

這裏是你的代碼,但很少修改,使其正常工作:對

class Calculate { 
    public static void calculate() { 
     Scanner br = new Scanner(System.in); 

     int[] c = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 
     int[] d = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 

     int sum; 
     int a = br.nextInt(); 
     System.out.println("Digit is:" + a); 

     int e = 0; 
     for (int i = 0; i < 10; i++) { 

      if (a == ((c[i] * 10) + d[e])) { 
       sum = ((c[i] * 10) + d[e]); 
       System.out.println("First digit is:" + c[i] 
         + " Second digit is:" + d[e] 
         + "\n" + "Sum of digits=" + sum); 
       break; 
      } else if (i == 9) { 
       i = 0; 
       e++; 
      } else if (e == 10) { 
       System.out.println("INVALID NO. HAS BEEN DETECTED"); 
       break; 
      } 
     } 
    } 
} 
+0

這將是很好的補充解釋爲什麼它沒有工作更早。關於在每個循環迭代中用'0'初始化'e'的一部分,即使它可能在循環中增加,似乎對理解這個無限循環至關重要。 – Pshemo

+0

你是對的,但它不是唯一的原因! 循環必須在到達正確的第一個和第二個數字時結束,所以我在第一個(if塊)中添加了(break;)語句。此外,我已經將它添加到最後(如果塊),所以它會在e> 9時結束循環。 – Mohammed

相關問題