Сумма цифр в C # - PullRequest
       115

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

35 голосов
/ 26 января 2009

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

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

Ответы [ 17 ]

93 голосов
/ 26 января 2009

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

sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}
38 голосов
/ 26 января 2009

Я использую

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

Используется только 1 строка кода.

16 голосов
/ 26 января 2009

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

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

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

11 голосов
/ 26 января 2009
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
10 голосов
/ 26 января 2009
 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;
 }
3 голосов
/ 26 января 2009

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

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

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

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

2 голосов
/ 29 января 2014

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

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

int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
1 голос
/ 20 мая 2016
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

.
1 голос
/ 05 марта 2009

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

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.

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

0 голосов
/ 11 ноября 2017

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

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();
...