web-dev-qa-db-ja.com

C#の数字の合計

数字の合計を計算する実装のうち、最も速くて読みやすいものは何ですか?

つまり与えられた数:17463 = 1 + 7 + 4 + 6 + 3 = 21

36
Xn0vv3r

文字列を使用せずに算術的に行うことができます:

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

私が使う

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のソリューションは小数点に達すると完全に失敗します。

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

私は完了のためにこれを投稿するだけだと思った:

数字の再帰的な合計が必要な場合:1746-> 1 + 7 + 4 + 6 + 3 = 21-> 2 + 1 =
その後、最善の解決策は

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

私はチャウマンの反応が好きですが、1つの変更を行います

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

C-'0'でさえ、構文が機能するかどうかさえわかりませんか? (2つの文字を減算すると、結果として文字が得られると思いますか?)

私はそれが最も読みやすいバージョンだと思います(すべての文字に対してそれを行うことを示すラムダ式と組み合わせたWordの合計の使用)。しかし、確かに、私はそれが最速になるとは思わない。

3
Tjipke
int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();
1
Stephan Regan
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
Kostis Hudalas

最も読みやすい実装は次のようにすることをお勧めします。

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

これは機能し、非常に読みやすいです。ところで:Convert.ToInt32( '3')は3ではなく51を与えます。Convert.ToInt32( '3'-'0')は3を与えます。

最速の実装はGreg Hewgillの算術ソリューションだと思います。

1
sindre j

しばらく前に、何かの数字の合計を見つけなければなりませんでした。私は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はこのプロセスに使用されるdouble、sumDはdoubleの数字の合計、sumIは整数の数字の合計、したがって正しい数字の合計です。

0
Moritz Krämer
#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;
}
0
Kuanysh Mukayev

最も簡単で簡単な方法は、ループを使用して 桁の合計を見つける にすることです。

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
0
Pankaj Prakash
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
0
Saravanan Daya
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;
}
0
stati.chobanov
while(ino!=0 )
{
  digit=(ino%10));
  printf("%d",digit);
  ino=ino/10;   
}           

このような配列の場合i/p:10 25 712 65

これは機能しません。誰かが他のロジックを取得した場合、他のロジックを試す必要があります。配列要素を追加するためにそれを投稿してください。

0
sachin bhikule