C#中的数字总和

时间:2009-01-26 06:18:48

标签: c# algorithm sum-of-digits

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

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

19 个答案:

答案 0 :(得分:93)

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

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

答案 1 :(得分:38)

我用

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

它只使用一行代码。

答案 2 :(得分:16)

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

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

这个数字是一个浮点数,应该采用不同的方法,并且当它达到小数点时,chaowman的解决方案将完全失败。

答案 3 :(得分:11)

int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;

答案 4 :(得分:10)

 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;
 }

答案 5 :(得分:3)

我喜欢chaowman的回复,但会做一次改变

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

我甚至不确定c - '0',语法是否有效? (我认为减去两个字符应该给出一个字符?)

我认为这是最易读的版本(使用sum和lambda表达式一起使用,表明你将为每个char执行此操作)。但实际上,我认为这不会是最快的。

答案 6 :(得分:2)

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

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

int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;

答案 7 :(得分:1)

我建议最容易阅读的实现类似于:

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

这很有效,而且很容易阅读。 BTW:Convert.ToInt32('3')给出51而不是3. Convert.ToInt32('3' - '0')给出3。

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

答案 8 :(得分:1)

allocate( a(2), b(2), source=0.0 )    !! (1)

这是为了提供0-9之间的数字之和

答案 9 :(得分:0)

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

答案 10 :(得分: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;
    }
}

答案 11 :(得分:0)

int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();

答案 12 :(得分:0)

前段时间,我不得不找到某事的数字总和。我使用了穆罕默德·哈桑汗的代码,但它仍然将正确的数字作为重复的小数返回,即当数字总和为4时,我得到4.444444444444444等。 因此我编辑了它,每次使用此代码得到数字总和:

    public class VertexCover{

        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            int[] row = {4, 2, 1, 5};
            Vertex[] adjLists = new Vertex[row.length];

            for (int i = 0; i < adjLists.length; i++) {
                adjLists[i] = new Vertex(row[i], null);
            }

            int max = -1;
            for (int i = 0; i < row.length; i++) {
                for (int j = 0; j < row.length; j++) {
                    if (adjLists[i].value > adjLists[j].value && i < j) {
                        adjLists[i].adjList = new Neighbour(j, adjLists[i].adjList);
                        adjLists[j].adjList = new Neighbour(i, adjLists[j].adjList);
                    }
                }
            }



            for (int i = 0; i < adjLists.length; i++) {
                System.out.print(adjLists[i].value);
                for (Neighbour neighbour = adjLists[i].adjList; neighbour != null; neighbour = neighbour.next) {
                    System.out.print("---->" + adjLists[neighbour.vertexNum].value);
                }
                System.out.println("");
            }



        }
    }

    class Vertex {

        int value;
        Neighbour adjList;

        Vertex(int value, Neighbour neighbours) {
            this.value = value;
            this.adjList = neighbours;
        }
    }

    class Neighbour {

        int vertexNum;
        public Neighbour next;

        public Neighbour(int vnum, Neighbour next) {
            this.vertexNum = vnum;
            this.next = next;
        }
    }

其中a是你想要的数字和的数字,n是用于这个过程的double,sumD是double的数字和,sumI是整数的数字和,所以正确的数字总和。

答案 13 :(得分:0)

s

答案 14 :(得分:0)

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

这样的数组 i / p:10 25 712 65

这不会工作你必须尝试其他逻辑,如果有人有一个请发布它添加数组元素。

答案 15 :(得分:0)

int j, k = 1234;
for(j=0;j+=k%10,k/=10;);

答案 16 :(得分:0)

最简单,最简单的方法是使用循环find sum of digits

int sum = 0;
int n = 1234;

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

答案 17 :(得分:-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();

答案 18 :(得分:-2)

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;
}