Сумма цифр в C#

Какая самая быстрая и легкая для чтения реализация расчета суммы цифр?

Т.е. дано число: 17463 = 1 + 7 + 4 + 6 + 3 = 21

17 ответов

Решение

Вы можете сделать это арифметически, без использования строки:

sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}

Я использую

int result = 17463.ToString().Sum(c => c - '0');

Он использует только 1 строку кода.

Для целых чисел Грег Хьюгилл имеет большую часть ответа, но забывает учитывать n < 0. Сумма цифр -1234 все равно должна быть 10, а не -10.

n = Math.Abs(n);
sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}

Если число является числом с плавающей запятой, следует использовать другой подход, и решение chaowman полностью потерпит неудачу, когда достигнет десятичной запятой.

 public static int SumDigits(int value)
 {
     int sum = 0;
     while (value != 0)
     {
         int rem;
         value = Math.DivRem(value, 10, out rem);
         sum += rem;
     }
     return sum;
 }
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;

Мне нравится ответ Chaowman, но сделаю одно изменение

int result = 17463.ToString().Sum(c => Convert.ToInt32(c));

Я даже не уверен, что с - '0', синтаксис будет работать? (вычитание двух символов должно дать символ в результате, я думаю?)

Я думаю, что это самая читаемая версия (использование слова sum в сочетании с лямбда-выражением, показывающим, что вы будете делать это для каждого символа). Но действительно, я не думаю, что это будет самым быстрым.

Я думал, что просто выложу это для завершения:

Если вам нужна рекурсивная сумма цифр, например: 17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
тогда лучшее решение будет

int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();

Я бы предположил, что самая легкая для чтения реализация будет выглядеть примерно так:

public int sum(int number)
{
    int ret = 0;
    foreach (char c in Math.Abs(number).ToString())
        ret += c - '0';
    return ret;
}

Это работает, и довольно легко читать. Кстати: Convert.ToInt32('3') дает 51, а не 3. Convert.ToInt32('3' - '0') дает 3.

Я бы предположил, что самая быстрая реализация - это арифметическое решение Грега Хьюгилла.

public static int SumDigits1(int n)
{
    int sum = 0;
    int rem;
    while (n != 0)
    {           
        n = Math.DivRem(n, 10, out rem);
        sum += rem;
    }
    return sum;
}

public static int SumDigits2(int n)
{
    int sum = 0;
    int rem;
    for (sum = 0; n != 0; sum += rem)   
        n = Math.DivRem(n, 10, out rem);        
    return sum;
}   

public static int SumDigits3(int n)
{
    int sum = 0;    
    while (n != 0)
    {
        sum += n % 10;
        n /= 10;
    }   
    return sum;
}   

Полный код: https://dotnetfiddle.net/lwKHyA

private static int getDigitSum(int ds)
{
    int dssum = 0;            
    while (ds > 0)
    {
        dssum += ds % 10;
        ds /= 10;
        if (dssum > 9)
        {                
            dssum -= 9;
        }
    }
    return dssum;
}

Это должно обеспечить сумму цифр между 0-9

Если кто-то хочет выполнить определенные операции, например, добавить только нечетные числа / четные числа, добавить числа только с нечетным индексом / четным индексом, то следующий код подходит лучше всего. В этом примере я добавил нечетные числа из входного числа.

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Please Input number");
        Console.WriteLine(GetSum(Console.ReadLine()));
    }
    
    public static int GetSum(string num){
        int summ = 0;
        for(int i=0; i < num.Length; i++){
            int currentNum;
            if(int.TryParse(num[i].ToString(),out currentNum)){
                 if(currentNum % 2 == 1){
                    summ += currentNum;
                }
            }
       } 
       return summ;
    }
}
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
static int SumOfDigits(int num)
{
    string stringNum = num.ToString();
    int sum = 0;
    for (int i = 0; i < stringNum.Length; i++)
    {
      sum+= int.Parse(Convert.ToString(stringNum[i]));

    }
    return sum;
}
while(ino!=0 )
{
  digit=(ino%10));
  printf("%d",digit);
  ino=ino/10;   
}           

для массива, подобного этому, i/p:10 25 712 65

это не сработает, вы должны попробовать другую логику, если кто-то ее получил, пожалуйста, опубликуйте ее для добавления элементов массива.

Некоторое время назад я должен был найти сумму в цифрах чего-либо. Я использовал код Мухаммеда Хасана Хана, однако он продолжал возвращать правильное число в виде повторяющегося десятичного числа, то есть, когда сумма цифр составляла 4, я получал 4.44444444444444 и т. Д. Поэтому я редактировал его, получая правильную сумму цифр каждый раз с этим кодом:

 double a, n, sumD;
 for (n = a; n > 0; sumD += n % 10, n /= 10);
 int sumI = (int)Math.Floor(sumD);

где a - число, сумму цифр которого вы хотите, n - двойное число, используемое для этого процесса, sumD - сумма цифр в двойном, а sumI - сумма цифр в целых числах, поэтому правильная сумма цифр.

Самый простой и легкий способ - использовать циклы для нахождения суммы цифр.

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
#include <stdio.h>

int main (void) {

    int sum = 0;
    int n;
    printf("Enter ir num ");
    scanf("%i", &n);

    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }

    printf("Sum of digits is %i\n", sum);

    return 0;
}

Удивлен никто не рассматривал метод Substring. Не знаю, является ли это более эффективным или нет. Для тех, кто знает, как использовать этот метод, он достаточно интуитивно понятен для подобных случаев.

string number = "17463";
int sum = 0;
String singleDigit = "";
for (int i = 0; i < number.Length; i++)
{
singleDigit = number.Substring(i, 1);
sum = sum + int.Parse(singleDigit);
}
Console.WriteLine(sum);
Console.ReadLine();
Другие вопросы по тегам