2015-04-14 2 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 добавляет странные числа себе, даже если отладчик показывает, что содержимое массива кажется правильным.

Буду признателен, если кто-нибудь объяснит мне, что я сделал не так, и откуда эти цифры. Если что-то неясно, я с радостью попытаюсь добавить дополнительную информацию.

+3

Вы добавляете значения символов вместо их целочисленных значений. Разделите их на целочисленное значение перед добавлением в 'sum'. Google «конвертирует символ в целое число в 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

Ты получил это сейчас :) – ViktorG

+0

Без проблем ... Рад, что я мог помочь! – brso05

1

Вы делаете сумму с величиной unicode каждого символа. Значения «1» = 49, '2' = 50, '3' = 51.

Если вы хотите сделать сумму с помощью значений unicode и получить реальные значения каждого символа, вы можете сделать функцию как это:

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

Вы можете искать значение юникода каждого значения here

+1

Java (.NET, JavaScript, HTML, ...) использует Unicode, а не ASCII. Таким образом, таблица ASCII не будет давать все значения. Вот таблица [Unicode] (http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF). –

+0

Спасибо @TomBlodget, моя ошибка. – Rubico

1

проблема заключается в том, что йо u добавляет символ, но вы должны добавить integer .Because + operand на char всегда будет давать вам сумму своих значений в unicodes.

Вместо найти сумму цифр вы можете сделать

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; 
} 
Смежные вопросы