Как суммировать цифры целого в java?
Мне сложно определить решение этой проблемы. Я пытаюсь разработать программу на Java, которая принимает число, например 321, и находит сумму цифр, в этом случае 3 + 2 + 1 = 6. Мне нужны все цифры любого трехзначного числа, чтобы добавить их вместе, и сохраните это значение, используя символ% остатка. Это меня сбивало с толку, и я был бы признателен за любые идеи.
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); >
Простое решение с использованием потоков:
int n = 321; int sum = String.valueOf(n) .chars() .map(Character::getNumericValue) .sum();
Вы можете сделать это, используя 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
Рекурсии всегда быстрее, чем циклы!
public static long sumDigits(long i) < return i == 0 ? 0 : i % 10 + sumDigits(i / 10); >
Разве вы не можете сделать это рекурсивно что-то вроде этого? Я немного новичок в программировании, но я проследил это, и я думаю, что это работает.
Это должно работать нормально для любого количества цифр, и оно будет возвращать отдельную цифру суммы
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 >
Если вы любите постоянное время, попробуйте это:
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).
В случае десятичной точки удалите его и добавьте итоговые цифры.
Следующий способ выполнит задачу:
public static int sumOfDigits(int n)
Вы можете использовать его следующим образом:
System.out.printf("Sum of digits = %d%n", sumOfDigits(321));
public static void main(String args[]) < int number = 333; int sum = 0; int num = number; while (num >0) < int lastDigit = num % 10; sum += lastDigit; num /= 10; >System.out.println("Sum of digits : "+sum); >
В Java 8 это возможно в одной строке кода следующим образом:
int sum = Pattern.compile("") .splitAsStream(factorialNumber.toString()) .mapToInt(Integer::valueOf) .sum();
Возможно, слишком поздно, но я вижу, что многие решения, размещенные здесь, используют сложность времени 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, и мы избегали одного дополнительного цикла.
Надеюсь, это поможет.
Может быть немного поздно.. но вот как вы можете это сделать рекурсивно
public int sumAllDigits(int number) < int sum = number % 10; if(number/10 < 10)< return sum + number/10; >else < return sum + sumAllDigits(number/10); >
public int sum(int number) < return (number + "").chars() .map(digit ->digit % 48) .sum(); >
Преобразует число в строку, а затем каждый символ сопоставляется с его цифровым значением, вычитая значение ascii ‘0’ (48) и добавляя к окончательной сумме.
Суммирует все цифры независимо от размера номера.
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; >
Если вам нужна строчка, думаю, это очень хорошее решение:
int sum(int n)< return n >= 10 ? n % 10 + sum(n / 10) : n; >
Java 8 Рекурсивное решение, если вы не хотите использовать какие-либо потоки.
UnaryOperator sumDigit = num -> num
Long sum = sumDigit.apply(123L);
Вышеупомянутое решение будет работать для всех положительных чисел. Если вы хотите получить сумму цифр независимо от положительного или отрицательного значения, воспользуйтесь приведенным ниже решением.
UnaryOperator sumDigit = num -> num
без картирования → более быстрое лямбда-решение
Integer.toString( num ).chars().boxed().collect( Collectors.summingInt( (c) -> c - '0' ) );
Integer.toString( num ).codePoints().boxed().collect( Collectors.summingInt( Character::getNumericValue ) );
Вот простая программа для суммы цифр номера 321.
import java.math.*; class SumOfDigits < public static void main(String args[]) throws Exception < int sum = 0; int i = 321; sum = (i % 10) + (i / 10); if (sum >9) < int n = (sum % 10) + (sum / 10); System.out.print("Sum of digits of " + i + " is " + n); >else < System.out.print("Sum of digits of " + i + " is " + sum ); >> > Output: Sum of digits of 321 is 6
Или просто вы можете использовать этот..check ниже программы.
public class SumOfDigits < public static void main(String[] args) < long num = 321; /* int rem,sum=0; while(num!=0) < rem = num%10; sum = sum+rem; num=num/10; >System.out.println(sum); */ if(num!=0) < long sum = ((num%9==0) ? 9 : num%9); System.out.println(sum); >>
Моя более простая, чем другие, надеюсь, вы можете это понять, если вы какой-то новый программист, как я.
import java.util.Scanner; import java.lang.Math; public class DigitsSum < public static void main(String[] args) < Scanner in = new Scanner(System.in); int digit = 0; System.out.print("Please enter a positive integer: "); digit = in.nextInt(); int D1 = 0; int D2 = 0; int D3 = 0; int G2 = 0; D1 = digit / 100; D2 = digit % 100; G2 = D2 / 10; D3 = digit % 10; System.out.println(D3 + G2 + D1); >>
В дополнение к ответам здесь я могу немного объяснить. Это на самом деле математическая проблема.
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); > >
Подсчитать сумму цифр в целом числе
Рекурсия, подсчитать количество цифр в заданном целом числе
Подсчитать количество цифр в заданном целом числе n
Подсчитать количество цифр в заданном натуральном числе и найдите сумму цифр заданного натурального числа
Подсчитать количество цифр в заданном натуральном числе и найдите сумму цифр заданного натурального.
Подсчитать количество цифр в заданном числе n, сумму цифр числа n, и выяснить, входит ли цифра 3 в его запись
Задано натуральное число n. Составить программу, которая подсчитывает количество цифр в числе n.
1 2 3 4 5 6 7 8 9 10 11 12
public class B{ public static void main (String[] args){ String s="1234"; String[] a = s.split(""); int m=0; for(int i=1;ia.length;i++){ m+=Integer.parseInt(a[i]); } System.out.println(m+""); } }
1 2 3 4 5 6 7 8 9 10 11 12
public class demo { public static void main(String[] args) { int k = 12345; int x =k; int s = 0; while (x != 0 ){ s +=x%10; x /=10; } System.out.println("Сумма цифр в числе " + k + " = " + s); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import java.util.Scanner; class DigitsCounter { private static int digitsCount(int n) { return ( n 0 ) ? digitsCount(-n) : ( n == 0 ) ? 1 : (int)Math.log10(n) + 1; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while ( true ) { System.out.print("Number: "); if ( ! sc.hasNextInt() ) break; int n = sc.nextInt(); System.out.println(digitsCount(n) + " digits"); } } }
Сообщение от easybudda
оригинальный способ, я обычно в строку и ее длину 🙂
turbanoff, а как Вы себе это число представляете положительным 32-битным целым? Да и выпендрёжные варианты исключительно для выпендрёжа, а не чтобы во всех маргинальных случаях работали.
Сообщение от easybudda
А зачем это делать? Вы же считаете только количество цифр, вам не нужно его "представлять" в каком-либо другом виде.
turbanoff, то есть нужно было написать комментарий с той частью курса математики, в которой объясняется, почему не бывает числа, в степень которого нужно возвести число 10, чтобы получить отрицательное число, или хотябы ноль. Добавить небольшой трактат на тему машинного представления целых чисел. И всё ради того, чтобы сказать - да, таки эта функция с числом -2147483648 не справится.
Вот вариант с подсчётом суммы цифр в числе, снова выпендрёжный и снова при вводе -2147483648 приводящий к аццкой рекурсии, валящей программу с этим самым Stack. ну Вы в курсе
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
import java.util.Scanner; class DigitsSum { private static int digitsSum(int n) { return ( n 0 ) ? digitsSum(-n) : ( n == 0 ) ? 0 : n % 10 + digitsSum(n / 10); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while ( true ) { System.out.print("Number: "); if ( ! sc.hasNextInt() ) break; int n = sc.nextInt(); System.out.println("Sum of digits: " + digitsSum(n)); } } }
Как найти сумму цифр числа java
Сумму цифр числа можно найти, суммируя остаток от деления на 10 :
public class App public static void main(String[] args) System.out.println(sumOfDigits(123)); // => 6 > public static int sumOfDigits(int number) number = Math.abs(number); int sum = 0; while (number > 0) sum += number % 10; number /= 10; > return sum; > >
P0huber / SummingJunction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
package com . javarush . task . task04 . task0442 ; |
/* |
Суммирование. Summing junction. |
*/ |
import java . io .*; |
public class SummingJunction |
public static void main ( String [] args ) throws Exception |
BufferedReader r = new BufferedReader ( new InputStreamReader ( System . in )); |
int a = Integer . parseInt ( r . readLine ()), k = 0 ; |
while ( a != - 1 ) |
k += a ; //the calculation of every cycle |
a = Integer . parseInt ( r . readLine ()); |
> |
System . out . println ( k - 1 ); //printing the sum all digits - 1 |
> |
> |
/*Суммирование |
Вводить с клавиатуры числа и считать их сумму. |
Если пользователь ввел -1, вывести на экран сумму и завершить программу. |
-1 должно учитываться в сумме. |
Требования: |
1. Программа должна считывать числа c клавиатуры. |
2. Программа должна выводить число на экран. |
3. Программа должна посчитать сумму введенных чисел. Если пользователь ввел -1, |
вывести на экран сумму и завершить программу. |
4. В программе должен использоваться цикл for или цикл while.*/ |
Нахождение суммы и среднего значения в массиве Java
В этом кратком руководстве мы рассмотрим, как вычислить сумму и среднее значение в массиве Java, используя стандартные циклы.
Чтобы найти сумму всех элементов в массиве, мы можем просто перебрать массив и добавить каждый элемент к суммирующей переменной.
public static int findSumWithoutUsingStream(int[] array) < int sum = 0; for (int value : array) < sum += value; >return sum; >
или вычисляем сумму используя индексы:
int array[] = ; int sum = 0; for (int i = 0; i < array.length; ++i) sum += array[i];
Можно использовать Stream API для достижения того же результата:
public static int findSumUsingStream(int[] array)
Важно знать, что метод sum() поддерживает примитивные типы.
Если мы хотим использовать целочисленные значения, сначала нужно преобразовать поток в IntStream, используя mapToInt метод. После этого применить метод sum() к нашему недавно преобразованному IntStream:
public static int findSumUsingStream(Integer[] array)
Найти среднее значение элементов массива Java довольно легко. Напомним, что среднее = сумма чисел/количество чисел.
public static double findAverageWithoutUsingStream(int[] array) < int sum = findSumWithoutUsingStream(array); return (double) sum / array.length; >
Примечание: деление int на int возвращает результат int. Джава массив имеет поле length, в котором хранится количество элементов.
Если подсчитывать через Java Stream API, то код умещается в одну строчку:
public static double findAverageUsingStream(int[] array)
IntStream.average () возвращает OptionalDouble, который может не содержать значения и требует специальной обработки.
Чтобы узнать больше об OptionalDouble class, читайте документацию по Java 8.
Исходный код можно скачать тут.
Средняя оценка 2.6 / 5. Количество голосов: 5
Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.