代码之家  ›  专栏  ›  技术社区  ›  Xn0vv3r

C中的数字和#

  •  34
  • Xn0vv3r  · 技术社区  · 17 年前

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

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

    17 回复  |  直到 17 年前
        1
  •  108
  •   Greg Hewgill    17 年前

    不使用字符串,您可以通过算术运算完成:

    sum = 0;
    while (n != 0) {
        sum += n % 10;
        n /= 10;
    }
    
        2
  •  44
  •   Chaowlert Chaisrichalermpol    17 年前

    我用

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

        3
  •  17
  •   Ants    17 年前

    对于整数,格雷格·休吉尔(Greg Hewgill)掌握了大部分答案,但忘了解释n<0-1234的数字之和仍应为10,而不是-10。

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

    如果该数字是一个浮点数,则应采取另一种方法,当它到达小数点时,chaowman的解决方案将完全失败。

        4
  •  14
  •   Muhammad Hasan Khan    17 年前
    int num = 12346;
    int sum = 0;
    for (int n = num; n > 0; sum += n % 10, n /= 10) ;
    
        5
  •  11
  •   Jon Skeet    17 年前
     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;
     }
    
        6
  •  3
  •   Brad Mace Mike King    15 年前

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

    我甚至不确定c-“0”的语法是否有效?(我认为,减去两个字符应该得到一个字符?)

    我认为这是最可读的版本(使用sum这个词和lambda表达式结合使用,表示您将对每个字符执行此操作)。但事实上,我不认为这将是最快的。

        7
  •  3
  •   Nolonar    11 年前

    为了完成,我想我应该发布这个:

    如果需要递归的数字和,例如: -&燃气轮机;1 + 7 + 4 + 6 + 3 = 21

    int result = input % 9;
    return (result == 0 && input > 0) ? 9 : result;
    
        8
  •  2
  •   Stephan Regan    8 年前
    int n = 17463; int sum = 0;
    for (int i = n; i > 0; i = i / 10)
    {
    sum = sum + i % 10;
    }
    Console.WriteLine(sum);
    Console.ReadLine();
    
        9
  •  1
  •   sindre j    17 年前

    我建议最容易阅读的实现应该是:

    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的算术解决方案。

        10
  •  1
  •   Gangaraju Anjali Pavithra    10 年前
    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之间的数字总和

        11
  •  0
  •   Saravanan Daya    10 年前
    int j, k = 1234;
    for(j=0;j+=k%10,k/=10;);
    
        12
  •  0
  •   Moritz Krämer    9 年前

    前一段时间,我必须找到一些东西的数字和。我使用了穆罕默德·哈桑·汗的密码,但它总是以循环小数的形式返回正确的数字,即当数字和为4时,我会得到4.4444等。 因此,我对其进行了编辑,每次都使用以下代码获得正确的数字和:

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

        13
  •  0
  •   johnny 5    7 年前
    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;
    }
    
        14
  •  0
  •   Tejas    5 年前

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

    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;
        }
    }
    
        15
  •  0
  •   gschuster    5 年前
    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

        16
  •  -1
  •   Pankaj Prakash    10 年前

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

    int sum = 0;
    int n = 1234;
    
    while(n > 0)
    {
        sum += n%10;
        n /= 10;
    }
    
        17
  •  -1
  •   DanielBarbarian kdgilang    9 年前
    #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;
    }
    
        18
  •  -2
  •   cricketycrack    8 年前

    令人惊讶的是,没有人考虑使用子字符串方法。不知道它是否更有效率。对于任何知道如何使用这种方法的人来说,对于这样的情况,这是非常直观的。

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