我一直在尝试欧拉计划的挑战之一,但是我一直困扰着一个烦人的问题。
double sum = 0;
string numbers = "3710728753390210279...."
foreach (int item in numbers) sum += item;
Console.WriteLine(sum);
Console.ReadLine();
当我运行此代码时,它不会按照期望的方式拆分每个数字,例如相反,第一个数字3将为51,第二个数字7将为55。我不知道从何处获得这些数字。
谢谢。
答案 0 :(得分:4)
这里的其他答案没有说明为什么您看到那些意外的数字。
我认为您可能期望循环foreach (int item in numbers)
循环遍历字符串中的各个“数字”,并将这些数字自动转换为整数。那不是正在发生的事情(嗯,是的,但不是您的期望)。
foreach
循环将string
转换为IEnumerable<char>
,并循环访问以char
开头的字符串中的每个'3', '7', '1', ...
字符。
在.Net
中,字符和字符串以UTF-16 unicode编码(如@TomBlodget在注释中指出的那样)。这意味着每个char
都可以转换为其字符代码单位。您的代码实际上将字符代码单位相加。
在C#
中,字符'0', '1',..,'9'
的代码单位在48,...,57范围内。因此,您可以执行类似@Yeldar的答案:
foreach (char item in numbers)
sum += item - '0'; // if item == '9' this is equivalent to 57 - 48 = 9
因此,如果字符串仅包含数字,则减去'0'
字符将把char
隐式转换为与其对应的int
,您最终将得到它表示的实际数值(即'7' - '0' => 55 - 48 = 7
)。
此处的其他答案提供了解决此问题的解决方案。我认为这对解释为什么会发生很有帮助。
答案 1 :(得分:1)
如果您知道字符串仅包含数字,则可以使用该功能:
string numbers = "3710728753390210279";
int sum = numbers.Sum(x => x - '0');
如果您不确定它仅包含数字,则将过滤掉非数字:
int sum = numbers.Where(char.IsDigit).Sum(x => x - '0');
答案 2 :(得分:0)
如果您确定字符串中仅包含数字,则可以实际减去char '0'
的值,这将为您带来神奇的作用:
int sum = 0;
string numbers = "371";
foreach (char item in numbers)
sum += item - '0';
Console.WriteLine(sum);
请注意,char
中有foreach
,因此没有隐式转换为int
。此外,int
也用于sum
,而不是double
,因为在这里实际上不需要浮点数。
答案 3 :(得分:0)
该解决方案稍微冗长一些,但它可以让您清楚地了解正在发生的情况,并且还可以排除字符串中可能弹出的任何非数字字符:
double sum = 0;
string numbers = "3710728753390210279";
foreach (char item in numbers)
{
int intVal;
if(int.TryParse(item.ToString(), out intVal))
sum += intVal;
}
Console.WriteLine(sum);