Сложить цифры числа java

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

Источник

Читайте также:  Css высота блока изменяемая
Оцените статью