C#中数字的位数总和?

时间:2014-05-14 17:16:01

标签: c# python sum digits

我正在尝试编写一个代码,它总结一个数字的数字并且它应该可以工作,但是我找不到我在做错的地方,我在Python中有一个工作代码,我试图这样做在C#中的方式相同但是..这是两个代码

的Python:

number = "12346546"
summ=0
for i in number:
    summ+=int(i)
print summ

C#:

string num = "2342";
int sum = 0;

for (int i = 0; i < num.Length; i++)
{
    int number = Convert.ToInt32(num[i]);
    sum += number;
}
Console.WriteLine(sum);

编辑:我使用调试器,我发现当我转换数字时,它们变成完全不同的数字,但如果我转换整个字符串然后它正确转换...如何解决这个问题?

7 个答案:

答案 0 :(得分:4)

num[i]charConvert.ToInt32将返回char的ASCII码而不是实际的数值。使用:

int number = Convert.ToInt32(num[i].ToString());

同时将i < num.Length-1更改为i < num.Length

编辑:为了更清楚,这里有一个例子:

int n1 = Convert.ToInt32('0'); // Uses Convert.ToInt32(char) result -> 48
int n2 = (int) '0'; // cast from char to int result -> 48
int n3 = Convert.ToInt32("0"); // Uses Convert.ToInt32(string) result -> 0

答案 1 :(得分:3)

替换Convert.ToInt32(num[i])

通过

Convert.ToInt32(num[i].ToString())

否则,您将获得ascii值...(因为num[i]char

请参阅msdn

答案 2 :(得分:2)

C#字符串末尾没有空值,因此您不必担心它,因此循环中不需要“-1”。但是,有一种更简单的方法:

string num = "2342";
int sum = num.ToCharArray().Select(i => int.Parse(i.ToString())).Sum();

这会将字符串转换为字符数组,将它们全部转换为整数(在过程中返回IEnumerable<int>),然后返回它们的总和。

答案 3 :(得分:1)

Convert.ToInt32(num[i]);会为您提供字符数字的ASCII值。例如,对于字符1,您将获得49

使用char.GetNumericValue之类的:

for (int i = 0; i < num.Length; i++)
{
    int number = (int) char.GetNumericValue((num[i]));
    sum += number;
}

您还需要修改循环以继续直到长度,因为您使用的是<

如果您想使用LINQ,那么您可以这样做:

int sum = num.Select(r => (int)char.GetNumericValue(r)).Sum();

答案 4 :(得分:1)

使用Linq的单行解决方案:

string num = "2342";
int sum = num.Sum(c=> Convert.ToInt32(c.ToString()));

这是一个小提琴:https://dotnetfiddle.net/3jt7G6

答案 5 :(得分:0)

你可以结合一些事情。

您可以使用Linq(Sum() is a Linq method)从char中选择string的集合。

您仍然需要将这些字符转换为数字;您可以通过将字符转换为字符串并解析它,或者您可以使用其他内置方法来完成此操作。

var sum = num.Sum(i => Char.GetNumericValue(i));

答案 6 :(得分:0)

char的核心只是一个数字。它恰好是一个代表角色的数字。

以下是一些强调这一点的解决方案:

int sum = num.Sum(c => c) - '0' * num.Length;

// or

int sum = 0;    
for (int i = 0; i < num.Length; i++)
{
    sum += num[i] - '0';
}