Как сложить цифры целого числа в Java?
Мне сложно определить решение этой проблемы. Я пытаюсь разработать программу на Java, которая принимает число, например 321, и находит сумму цифр, в этом случае 3 + 2 + 1 = 6. Мне нужны все цифры любого трехзначного числа, чтобы добавить их вместе, и сохраните это значение, используя символ% остатка. Это меня сбивало с толку, и я был бы признателен за любые идеи.
Вы пытаетесь вычислить цифровой корень любого трехзначного числа? Если да, то какая часть доставляет вам неприятности?
Ну, я просто пытаюсь взять любое число, например 480, и сделать его равным всем его цифрам (4, 8, 1), чтобы сложить их, используя символ%. Мне нужно создать цикл в Java, который может сделать это.
Кажется, что у вас уже есть число в виде целого числа — я предположил, что ваш ввод был строкой — (иначе я не совсем понимаю, какая часть этой по существу математической проблемы вызывает у вас проблемы)
17 ответов
public static void main(String[] args) < int num = 321; int sum = 0; while (num >0) < sum = sum + num % 10; num = num / 10; >System.out.println(sum); >
Это работает. Ожидаемый класс @ShaneLarsen, интерфейс или перечисление обычно означает отсутствие фигурной скобки.
Рекурсии всегда быстрее, чем циклы!
public static long sumDigits(long i) < return i == 0 ? 0 : i % 10 + sumDigits(i / 10); >
Вы можете сделать это, используя Recursion
//Sum of digits till single digit is obtained public int sumOfDigits(int num) < int sum = 0; while (num >0) < sum = sum + num % 10; num = num / 10; >sum = (sum
Если вы любите постоянное время, попробуйте это:
double d = 10984.491; // converting to String because of floating point issue of precision String s = new String(d + "").replaceAll("\\D+",""); int i = Integer.parseInt(s); System.out.println(i % 9 == 0 ? 9 : i % 9);
Логика — это если вы добавите любое число на 9, в результате добавление цифры приведет к тому же числу.
Пример: 6 + 9 = 15, затем 1 + 5 = 6 (снова вы получили 6).
В случае десятичной точки удалите его и добавьте итоговые цифры.
Это не ответ на вопрос, потому что это решение суммирует рекурсивно, например: 456 -> 4+5+6 = 15 -> 1+5 = 6 , а не 456 -> 4+5+6 = 15 Но оно подходит мой случай, так что +1 🙂
Суммирует все цифры независимо от размера номера.
private static int sumOfAll(int num) < int sum = 0; if(num >10) < sum += num % 10; while((num = num / 10) >= 1) < sum += (num >10) ? num%10 : num; > > return sum; >
public int sum(int number) < return (number + "").chars() .map(digit ->digit % 48) .sum(); >
Преобразует число в строку, а затем каждый символ сопоставляется с его цифровым значением, вычитая значение ascii ‘0’ (48) и добавляя к окончательной сумме.
Простое решение с использованием потоков:
int n = 321; int sum = String.valueOf(n) .chars() .map(Character::getNumericValue) .sum();
В дополнение к ответам здесь я могу немного объяснить. Это на самом деле математическая проблема.
321 — общее число 300 + 20 + 1.
Если вы разделите 300 на 100, вы получите 3.
Если вы разделите 20 на 10, вы получите 2.
Если вы разделите 1 на 1, вы получите 1.
В конце этих операций вы можете суммировать их все, и вы получите 6.
public class SumOfDigits < public static void main(String[] args) < int myVariable = 542; int checker = 1; int result = 0; int updater = 0; //This while finds the size of the myVariable while (myVariable % checker != myVariable) < checker = checker * 10; >//This for statement calculates, what you want. for (int i = checker / 10; i > 0; i = i / 10) < updater = myVariable / i; result += updater; myVariable = myVariable - (updater * i); >System.out.println("The result is " + result); > >
Разве вы не можете сделать это рекурсивно что-то вроде этого? Я немного новичок в программировании, но я проследил это, и я думаю, что это работает.
Я бы добавил где-нибудь проверку if, потому что в настоящее время sum будет бесконечно вызывать себя, вызывая ошибку хоста этого сайта;) ( StackOverflowError ). Что-то вроде int sum(int n) < if(n >9) < return n%10 + sum(n/10); >return n;>
Это должно работать нормально для любого количества цифр, и оно будет возвращать отдельную цифру суммы
public static void main(String[] args) < Scanner input = new Scanner(System.in); System.out.println("enter a string"); String numbers = input.nextLine(); //String would be 55 int sum = 0; for (char c : numbers.toCharArray()) < sum += c - '0'; >System.out.println(sum); //the answer is 10 >
Может быть немного поздно.. но вот как вы можете это сделать рекурсивно
public int sumAllDigits(int number) < int sum = number % 10; if(number/10 < 10)< return sum + number/10; >else < return sum + sumAllDigits(number/10); >
Возможно, слишком поздно, но я вижу, что многие решения, размещенные здесь, используют сложность времени O (n ^ 2), это нормально для небольших входов, но по мере того, как вы продвигаетесь с большими входами, вы можете уменьшить временную сложность, Вот что я сделал, чтобы сделать то же самое в линейной временной сложности.
ПРИМЕЧАНИЕ. Второе решение, размещенное Arunkumar, является постоянной временной сложностью.
private int getDigits(int num) < int sum =0; while(num >0) < //num consists of 2 digits max, hence O(1) operation sum = sum + num % 10; num = num / 10; >return sum; > public int addDigits(int N) < int temp1=0, temp2= 0; while(N >0) < temp1= N % 10; temp2= temp1 + temp2; temp2= getDigits(temp2); // this is O(1) operation N = N/ 10; >return temp2; >
Пожалуйста, проигнорируйте мое соглашение об именах переменных, я знаю, что это не идеально. Позвольте мне объяснить код с образцом ввода, например. «12345». Выход должен быть 6, в одном обходе.
В основном, что я делаю, я перехожу от LSB к MSB и добавляю цифры найденной суммы на каждой итерации.
Изначально temp1 = temp2 = 0
N | temp1 ( N % 10) | temp2 ( temp1 + temp2 ) 12345 | 5 | 5 1234 | 4 | 5 + 4 = 9 ( getDigits(9) = 9) 123 | 3 | 9 + 3 = 12 = 3 (getDigits(12) =3 ) 12 | 2 | 3 + 2 = 5 (getDigits(5) = 5) 1 | 1 | 5 + 1 = 6 (getDigits(6) = 6 )
Ответ равен 6, и мы избегали одного дополнительного цикла. Надеюсь, это поможет.
Найти сумму и произведение цифр трехзначного числа.
Найти, во сколько раз произведение цифр трехзначного числа больше суммы цифр
найти во сколько раз произведение цифр трехзначного числа больше суммы цифр
Найти произведение цифр трехзначного числа
Дано трехзначное число. Найти произведение его цифр.
Найти произведение цифр трехзначного числа
Найти произведение цифр трехзначного числа. Программа на Паскале
Найти произведение цифр заданного трехзначного числа
Найти произведение цифр заданного трехзначного числа. Результат напечатать в виде "Дано число- 432.
Сообщение было отмечено Сулейман как решение
Решение
int n = 123; int s = 0, m = 1; for (int i = 0; i 3; i++) { m *= n % 10; s += n % 10; n /= 10; } System.out.println("Сумма: " + s); System.out.println("Произведение: " + m);
Заведём джаву. Внеурочная заметка №4. Сумма цифр трёхзначного числа.
Во внеурочных заметках я стараюсь размещать наиболее интересные решения популярных задач. В этот раз мы сосчитаем сумму цифр трехзначного числа. К примеру есть число 321 — сумма его чисел 6. Как же сказать об этом программе?
public class test3 < public static void main(String[] args) < System.out.println(sumnum(321)); >public static int sumnum(int number) < >>
Простейший класс, метод main, в котором мы выводим на экран значение, которое вернёт метод sumnum, если передать ему число 546, собственно и сам статический метод sumnum. Статический — дабы нам не создавать объект — сделаем в процедурном стиле.
Итак есть число 321, логично, что каждую цифру нужно «загнать» в массив.
Ага — подумали мы. Как же сказать программе, что это у нас массив?
Во-первых можно перевести число 321 в строку 321. Для этого можно воспользоваться методом valueOf.
Позволю себе немного «копипасты».
Метод valueOf() в Java имеет следующие варианты, которые зависят от передаваемых параметров. Этот метод возвращает строковое представление переданного аргумента.
- valueOf(boolean b): возвращает строковое представление логического аргумента.
- valueOf(char c): возвращает строковое представление char аргумента.
- valueOf(char[] data): возвращает строковое представление массив char аргументов.
- valueOf(char[] data, int offset, int count): возвращает строковое представление определенного подмассива массив char аргументов.
- valueOf(double d): возвращает строковое представление double аргумента.
- valueOf(float f): возвращает строковое представление float аргумента.
- valueOf(int i): возвращает строковое представление int аргумента.
- valueOf(long l): возвращает строковое представление long аргумента.
- valueOf(Object obj): возвращает строковое представление объекта аргумента.
import java.io.*; public class Test < public static void main(String args[])< double d = 102939939.939; boolean b = true; long l = 1232874; char[] arr = < 'а', 'б', 'в', 'г', 'д', 'е', 'ё' >; System.out.println("Возвращаемое значение: " + String.valueOf(d)); System.out.println("Возвращаемое значение: " + String.valueOf(b)); System.out.println("Возвращаемое значение: " + String.valueOf(l)); System.out.println("Возвращаемое значение: " + String.valueOf(arr)); > >
Получим следующий результат:
Возвращаемое значение: 1.02939939939E8 Возвращаемое значение: true Возвращаемое значение: 1232874 Возвращаемое значение: абвгдеё Взято отсюда: http://proglang.su/java/134 и вот это также рекомендую прочесть: http://proglang.su/java/67 В нашем случае будет как-то так:
System.out.println(String.valueOf(321));
После того, как мы получили строку из числа, неплохо бы её разбить на символы методом split.
Метод split() в Java разделяет данную строку вокруг данного регулярного выражения и имеет два варианта.
Синтаксис
public String[] split(String regex, int limit) или public String[] split(String regex)
Параметры
Подробная информация о параметрах:
- regex — разграничение регулярного выражения;
- limit — порог, результатом которого означает, как много строк, должно быть возвращено.
Возвращаемое значение
- В Java split() возвращает массив строк, вычисленных путем разделения данной строки вокруг данного регулярного выражения.
Взял отсюда: http://proglang.su/java/125
В качестве regexp в нашем случае будет выступать… как бы это выразиться. Ничего. Вот такие две кавычки «».
То есть наш код может выглядеть как-то так:
Отлично! Мы преобразовали число в строку и разбили её на символы, которые и записали в массив chislo типа String! В вышеприведённом коде мы обращаемся к элементу массива chislo с порядковым номером 1. То есть система нам выведет «2», так как элементы массива мы считаем, начиная с 0!
Но как же сосчитать общую сумму числе? Воспользуемся циклом for и методом length.
int result = 0; for (int i = 0; i
метод length считает количество элементов в массиве. Считает он их начиная с единицы, а не с 0!
Внутри у нас переменная result типа int, имеющая изначально значение 0. Метод parseInt() в Java используется для получения примитивного типа данных определенной строки. Метод статический. На вход он принимает String. Все, кроме целых чисел, «получат» Exception. (http://proglang.su/java/69)
При каждой итерации переменная result увеличивается на значение массива chislo[i], которое теперь уже не строка, а число!
result += Integer.parseInt(chislo[i]);
result = result + Integer.parseInt(chislo[i]);
В завершении наш код может выглядеть так:
public class test3 < public static void main(String[] args) < System.out.println(sumnum(321)); >public static int sumnum(int number) < String [] chislo = String.valueOf(number).split(""); int result = 0; for (int i = 0; i < chislo.length; i++) < result = result + Integer.parseInt(chislo[i]); >return result; > >
На выходе получим число 6. Задачку мы решили.