用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

用c#计算校验和

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()