Разбиение чисел на цифры

265
28 ноября 2017, 22:20

Сосчитать сумму цифр, при этом умножая каждую цифру на её порядковый номер (позицию) в числе, считая слева, начиная с единицы. Например 1567 - получается 1*1+5*2+6*3+7*4=57.

В этом коде вроде бы считает, но почему то выдает некорректный результат. Не пойму в чем проблема

public static void main(String[]args){
    int a = 56;
    int sum = 0;        
       String s = a+"";
       for (int j=0;j<s.length(); j++){
           sum+=(j+1)*s.charAt(j);               
       }
       System.out.println(sum);    
}
Answer 1

Так у вас ничего работать не будет. Если поставить цель сделать этот код рабочим, то пишите так:

int a = 56;
int sum = 0;
String s = String.valueOf(a);
for (int j = 0; j < s.length(); j++) {
    sum +=(j+1)*Integer.valueOf(s.substring(j, j+1));
}
System.out.println(sum);

Главная причина нерабочего кода в том, что метод charAt возвращает вам char, который по сути является числовым представлением символа. Поэтому расчет происходит именно исходя из этого числового представления, а не из фактического числа, которое вы видите в строке.

Но это плохой код. Преобразовывать инт в стринг и наоборот нецелесообразно. Вы тратите слишком много ресурсов: это медленные методы плюс нееоправданно большое количество объектов , разумеется , занимают память.

Для таких подсчетов просто делите число на 10, каждый раз получая цифру. Узнав все цифры, выполняйте с ними необходимые вычисления.

Answer 2

Метод String.charAt() возвращает char.

В java, char это числовое представление символа. Поэтому следующий код вполне себе работоспособный.

char a = 'a';
char b = 'b';
int i = a + b;
System.out.println(i);

Ошибок компиляции он не выдаст.

В данном случае:

a = 97
b = 98

В вашем случае:

'5' = 53
'6' = 54

Поскольку задачка учебная, дам только подсказку. Используйте оператор деления (/) и оператор получения остатка (%).

Answer 3

Как уже было сказано в других ответах - метода charAt возвращает тип char, в котором хранится код символа. В случае, если вы хотите использовать свою реализацию, но при этом, чтобы она работала правильно, то можно из каждого кода символа-цифры вычесть код символа 0 - получится правильное значение цифры. Код тогда будет следующим:

int a = 56;
int sum = 0;
String s = a + "";
for (int j = 0; j < s.length(); j++) {
    sum += (j + 1) * (s.charAt(j) - '0');
}
System.out.println(sum);

Но всё же, лучше решать такие задачи арифметически, а не через строки.

Answer 4
        int num = 1567;
        int len = 0;
        ArrayList<Integer> digits = new ArrayList<Integer>();
        while (num > 0) {
            digits.add(num % 10);
            num /= 10;
            len++;
        }
        int sum = 0;
        for (Integer digit : digits) {
            sum += digit * len;
            len--;
        }
        System.out.println(sum);
READ ALSO
Формат вывода числа в Apache POI

Формат вывода числа в Apache POI

У меня есть такие настройки для записи информации в строку

241
Реализовать поиск по списку

Реализовать поиск по списку

Доброго времени суток! Помогите пожалуйста реализовать поиск по спискуДве недели мучаюсь!

294
Конвертирование между форматами. Java

Конвертирование между форматами. Java

Хочу научится конвертировать mp4 в mp3 и тому подобное на JavaПодскажите в какую сторону начинать копать

207
Подключение org.apache.commons.net.ftp.FTP к проекту

Подключение org.apache.commons.net.ftp.FTP к проекту

В Java совсем новичок, но есть задача переписать ftp-клиент с C# на JavaПодскажите пожалуйста (желательно по пунктам), как подключить данную библиотеку?...

231