46

计算数字和的最快和最容易阅读的实现是什么?

即给定数字:17463 = 1 + 7 + 4 + 6 + 3 = 21

4

18 回答 18

109

您可以在不使用字符串的情况下进行算术运算:

sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}
于 2009-01-26T06:22:20.550 回答
46

我用

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

它仅使用 1 行代码。

于 2009-01-26T06:49:20.763 回答
17

对于整数,Greg Hewgill 有大部分答案,但忘记考虑 n < 0。-1234 的数字总和应该仍然是 10,而不是 -10。

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

如果数字是浮点数,则应采取不同的方法,而chaowman的解决方案在到达小数点时将完全失败。

于 2009-01-26T07:49:35.243 回答
14
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
于 2009-01-26T07:51:57.953 回答
13
 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;
 }
于 2009-01-26T06:23:03.110 回答
3

我喜欢chaowman的回应,但会做一个改变

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

我什至不确定 c - '0', 语法会起作用吗?(我认为减去两个字符应该得到一个字符?)

我认为它是最易读的版本(使用 sum 这个词与 lambda 表达式相结合,表明您将为每个字符都执行此操作)。但事实上,我认为这不会是最快的。

于 2009-01-26T07:40:02.737 回答
3

我想我只是为了完成而发布这个:

如果您需要数字的递归总和,例如:17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
那么最好的解决方案是

int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
于 2014-01-29T13:41:32.187 回答
3
int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();
于 2018-01-05T12:12:17.130 回答
1

我建议最容易阅读的实现是这样的:

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。

我认为最快的实现是 Greg Hewgill 的算术解决方案。

于 2009-03-05T10:16:42.323 回答
1
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 之间的数字总和

于 2016-05-20T17:41:14.917 回答
1
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

于 2020-09-02T17:02:05.750 回答
0
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
于 2016-04-15T04:59:14.273 回答
0

不久前,我必须找到某物的数字总和。我使用了 Muhammad Hasan Khan 的代码,但是它一直将正确的数字作为循环小数返回,即当数字总和为 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 是整数数字总和,因此是正确的数字总和。

于 2017-05-19T19:05:19.823 回答
0
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;
}
于 2018-05-30T13:17:38.737 回答
0

如果要执行特定操作,例如仅添加奇数/偶数,仅添加具有奇数索引/偶数索引的数字,那么以下代码最适合。在此示例中,我从输入数字中添加了奇数。

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;
    }
}
于 2020-07-05T19:47:08.180 回答
-1

最简单和最简单的方法是使用循环来查找数字总和

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
于 2015-08-10T09:46:36.437 回答
-1
#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;
}
于 2016-09-05T13:25:28.817 回答
-2

让没有人考虑 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();
于 2017-11-10T23:41:00.097 回答