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

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

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

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

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

于 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 に答える
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 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 の算術ソリューションだと思います。

于 2009-03-05T10:16:42.323 に答える
0
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
于 2016-04-15T04:59:14.273 に答える
-1

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

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
于 2015-08-10T09:46:36.437 に答える