在C#中计算校验和

时间:2013-03-19 16:21:48

标签: c# math calculus

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

5 个答案:

答案 0 :(得分:8)

t[0]是字符'1',t[1]是字符'4',它被翻译为49 + 52,因此为101.查看ASCII chart以查看是什么我在谈论。

您可以尝试使用Char.GetNumericValue()功能:

return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);

答案 1 :(得分:5)

您目前正在汇总Unicode代码点 - “1”为49,“4”为52,因此为101.您希望获取每个字符的数字值。

如果知道数字将在'0' - '9'范围内,最简单的方法就是减去'0'并使用LINQ {{1求和每个值的方法:

Sum

或者您可以使用public int SumDigits(string n) { return n.Sum(c => c - '0'); } ,但会返回Char.GetNumericValue(),因为它还会处理U + 00BD等字符:½。

答案 2 :(得分:0)

尝试转换n [0]和n [1]以在你的quersomme函数中分离int32

答案 3 :(得分:0)

您正在使用quesumme方法进行字符串连接。

应该是:

public int quersumme(string n)
{
   return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);
}

答案 4 :(得分:0)

在我看来,您试图枚举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()