0
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 并且 quesumme 应该执行 1+4 = 5

4

5 回答 5

8

t[0]是字符“1”,t[1]是字符“4”,它被转换为 49 + 52,因此是 101。查看ASCII 图表以了解我在说什么。

您可以尝试使用Char.GetNumericValue()函数:

return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);
于 2013-03-19T16:24:17.030 回答
5

您当前正在对 Unicode 代码点求和 - “1”是 49,“4”是 52,因此是 101。您想要获取每个字符的数字值。

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

public int SumDigits(string n)
{
   return n.Sum(c => c - '0');
}

或者您可以使用Char.GetNumericValue(),但它会返回,double因为它也可以处理 U+00BD: ½ 等字符。

于 2013-03-19T16:25:14.817 回答
0

尝试在您的 quersomme 函数中将 n[0] 和 n[1] 转换为单独的 int32

于 2013-03-19T16:24:29.573 回答
0

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

应该:

public int quersumme(string n)
{
   return (int)Char.GetNumericValue(n[0]) + (int)Char.GetNumericValue(n[1]);
}
于 2013-03-19T16:25:09.490 回答
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()
于 2013-03-19T16:40:12.453 回答