计算数字和的最快和最容易阅读的实现是什么?
即给定数字: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;
}
我喜欢chaowman的回应,但会做一个改变
int result = 17463.ToString().Sum(c => Convert.ToInt32(c));
我什至不确定 c - '0', 语法会起作用吗?(我认为减去两个字符应该得到一个字符?)
我认为它是最易读的版本(使用 sum 这个词与 lambda 表达式相结合,表明您将为每个字符都执行此操作)。但事实上,我认为这不会是最快的。
我想我只是为了完成而发布这个:
如果您需要数字的递归总和,例如:17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
那么最好的解决方案是
int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();
我建议最容易阅读的实现是这样的:
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 的算术解决方案。
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 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;
}
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
不久前,我必须找到某物的数字总和。我使用了 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 是用于此过程的双精度数,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;
}
}
最简单和最简单的方法是使用循环来查找数字总和。
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();