用c#计算校验和
本文关键字:校验和 计算 | 更新日期: 2023-09-27 18:04:37
numbers[i] = numbers[i] * 2;
if (numbers[i] >= 10)
{
string t = numbers[i].ToString();
Console.WriteLine(t[0] + " plus " + t[1]+" = "+quersumme(t).ToString());
numbers[i] = Convert.ToInt32(t[0]) + Convert.ToInt32(t[1]);
}
public int quersumme(string n)
{
return n[0] + n[1];
}
当我输入7时,函数返回101。但是7 * 2 = 14和quersumme应该做1+4 = 5
t[0]
是字符'1',t[1]
是字符'4',翻译成49 + 52,即101。查看ASCII图表,看看我在说什么。
您可以尝试使用Char.GetNumericValue()函数:
return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);
您当前正在对Unicode代码点求和- '1'是49,'4'是52,因此是101。要取每个字符的数字值
如果您知道数字将在'0'-'9'的范围内,那么最简单的方法就是减去'0'并使用LINQ Sum
方法将每个值求和:
public int SumDigits(string n)
{
return n.Sum(c => c - '0');
}
或者您可以使用Char.GetNumericValue()
,但这将返回double
,因为它还处理诸如U+00BD:½之类的字符。
尝试将n[0]和n[1]转换为quersomme函数中的独立int32
您正在使用quesumme方法进行字符串连接。
应该是:
public int quersumme(string n)
{
return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);
}
在我看来,你是在试图枚举int
中的数字。
尝试这样做以避免缓慢而繁琐的解析和转换。(这都是相对的,我还没有测试过性能。)
static IEnumerable<int> EnumerateDigits(int value, int baseValue = 10)
{
while (value > 0)
{
yield return value % baseValue;
value = value / baseValue
}
}
然后,如果你想把顺序转换成数组
var t = EnumerateDigits(numbers[i]).Reverse().ToArray();
但是,如果你只想对数字求和。
var checksum = EnumerateDigits(numbers[i]).Sum()