Как найти сумму цифр числа 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; > >
Как суммировать цифры целого в 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); > >
Как сложить цифры целого числа в 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, и мы избегали одного дополнительного цикла. Надеюсь, это поможет.