2015-04-14 130 views
0

我試圖自己學習Java,而且遇到了一個我不太明白的問題。 我試圖編寫一個程序來計算交叉和。我的想法是將輸入的數字拆分爲char數組,然後簡單地通過 運行數組並計算總和。這些數字從哪裏來?

這是我有:

public static int calcCrossSum (long number){ 
    int sum = 0; 
    char[] charArray = String.valueOf(number).toCharArray(); 

    for(int i = 0; i < charArray.length; i++){ 
     sum += charArray[i]; 
    } 
    return sum; 
} 

如果我試試這個方法用數字123,我得到150 結果,我不知道爲什麼。我試圖使用調試器,並且似乎我的變量test爲自己添加了奇怪的數字,即使調試器顯示Array的內容似乎是正確的。

如果有人能向我解釋我做錯了什麼以及這些數字來自哪裏,我將不勝感激。如果有什麼不清楚的地方,我會很樂意嘗試添加更多信息。

+3

您正在添加字符值而不是其整數值。在添加到sum之前,將它們解析爲一個整數值。谷歌「將字符轉換爲Java中的整數」 – Kon

+1

好吧,我得到了這個問題,但這些數字從哪裏來?我是否添加了字符的ASCII值? – ViktorG

回答

2

字符有一個與它們相關的整數值。你應該這樣做:

public static int calcCrossSum (long number){ 
    int sum = 0; 
    char[] charArray = String.valueOf(number).toCharArray(); 

    for(int i = 0; i < charArray.length; i++){ 
     sum += Integer.parseInt(("" + charArray[i])); 
    } 
    return sum; 
} 
+0

Ty現在明白了:) – ViktorG

+0

沒問題...很高興能幫到你! – brso05

1

你正在與每個char的unicode值進行求和。 這些值爲'1'= 49,'2'= 50,'3'= 51.

如果您想對unicode值進行求和並獲得每個char的實際值,您可以創建一個函數像這樣:

public static int charToInt(char c){ 
    return (int) c - 48; //48 is the value of '0' 
} 

並調用該函數:

public static int calcCrossSum (long number){ 
    int sum = 0; 
    char[] charArray = String.valueOf(number).toCharArray(); 

    for(int i = 0; i < charArray.length; i++){ 
     sum += charToInt(charArray[i]); 
    } 
    return sum; 
} 

你可以看看每個值的Unicode值here

+1

Java(.NET,JavaScript,HTML,...)使用Unicode,而不是ASCII。所以,一張ASCII表格不會給出所有的值。這是[Unicode表格](http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF)。 –

+0

謝謝@TomBlodget,我的錯誤。 – Rubico

1

的問題是,喲您正在添加字符,但您必須添加整數。因爲char上的+操作數將始終爲您提供其Unicode值的總和。

而是找數字,你可以做的總和

public static int calcCrossSum (long number){ 
    int sum = 0; 
    while (number > 0) 
     { 
      sum += number % 10; 
      number /= 10; 

     } 
    return sum; 
} 

Demo

0

這是我的解決方案,我敢肯定,你可以使它更簡單,但你去那裏:

public static int cross_sums(int input) { 
    int output = 0; 
    do { 
     output += input % 10; 
     input /= 10; 
    } while (input > 0); 

    if (output > 9) { 
     output = cross_sums(output); 
    } 
    return output; 
}