簡體   English   中英

C#中的數字總和

[英]Sum of digits in C#

計算數字總和的最快和最容易閱讀的實現是什么?

即給定數字:17463 = 1 + 7 + 4 + 6 + 3 = 21

您可以在不使用字符串的情況下進行算術運算:

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

我用

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

它僅使用 1 行代碼。

對於整數,Greg Hewgill 有大部分答案,但忘記考慮 n < 0。-1234 的數字總和應該仍然是 10,而不是 -10。

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

如果數字是浮點數,則應采取不同的方法,而chaowman的解決方案在達到小數點時將完全失敗。

int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 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;
 }

我以為我只是為了完成而發布這個:

如果您需要遞歸數字總和,例如: 17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
那么最好的解決方案是

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

我喜歡 chaowman 的回應,但會做一個改變

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

我什至不確定 c - '0',語法是否有效? (我認為減去兩個字符應該得到一個字符?)

我認為這是最易讀的版本(將單詞 sum 與 lambda 表達式結合使用,表明您將對每個字符執行此操作)。 但事實上,我認為它不會是最快的。

int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();
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之間的數字總和

我建議最容易閱讀的實現是這樣的:

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 的算術解決方案。

int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
while(ino!=0 )
{
  digit=(ino%10));
  printf("%d",digit);
  ino=ino/10;   
}           

對於像這樣的陣列i / p:10 25 712 65

這不會工作你必須嘗試其他邏輯如果有人有一個請發布它添加數組元素。

不久前,我必須找到某物的數字總和。 我使用了 Muhammad Hasan Khan 的代碼,但是它一直返回正確的數字作為循環小數,即當數字總和為 4 時,我會得到 4.444444444444444 等。因此我對其進行了編輯,每次使用以下代碼都使數字總和正確:

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

其中 a 是您想要的數字總和的數字,n 是用於此過程的雙精度數,sumD 是雙精度數的數字總和,而 sumI 是整數的數字總和,因此是正確的數字總和。

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

如果要執行特定的操作,例如僅添加奇數/偶數,添加僅具有奇數索引/偶數索引的數字,那么以下代碼最適合。 在這個例子中,我從輸入數字中添加了奇數。

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

最簡單和最簡單的方法是使用循環來查找數字總和

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM