桁の合計を計算する最も速くて読みやすい実装は何ですか?
つまり、数値を考えると: 17463 = 1 + 7 + 4 + 6 + 3 = 21
桁の合計を計算する最も速くて読みやすい実装は何ですか?
つまり、数値を考えると: 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;
}
私はチャオマンの反応が好きですが、1つの変更を行います
int result = 17463.ToString().Sum(c => Convert.ToInt32(c));
c - '0', 構文が機能するかどうかさえわかりませんか? (2文字を減算すると、結果として文字が得られるはずですか?)
私はそれが最も読みやすいバージョンだと思います(すべての文字に対してそれを行うことを示すラムダ式と組み合わせて単語 sum を使用します)。しかし、確かに、それが最速になるとは思いません。
完成のためにこれを投稿するだけだと思いました:
再帰的な数字の合計が必要な場合、たとえば: 17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
の場合、最適なソリューションは次のようになります。
int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
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') は 3 ではなく 51 を返します。Convert.ToInt32('3' - '0') は 3 を返します。
最速の実装は、Greg Hewgill の算術ソリューションだと思います。
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
最も簡単で簡単な方法は、ループを使用して数字の合計を見つけることです。
int sum = 0;
int n = 1234;
while(n > 0)
{
sum += n%10;
n /= 10;
}