2015-04-14 89 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; 
}