【问题标题】:Calculate checksum in C#在 C# 中计算校验和
【发布时间】:2013-03-19 16:21:48
【问题描述】:
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

【问题讨论】:

  • 有什么问题哦
  • 你真正想做的是什么?
  • 你正在使用你应该使用 char.GetNumericValue() 的 Char 值。
  • 主观上完全避免使用stringchar一定更优雅。 stackoverflow.com/a/15505378/659190

标签: c# math calculus


【解决方案1】:

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

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

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

【讨论】:

  • 我想到了 ASCII,甚至查了一下,但似乎我错过了表格中的重要部分。谢谢老兄!
【解决方案2】:

您当前正在对 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: ½之类的字符。

【讨论】:

  • @Jodrell:嗯,有点。没有你绝对可以做到。另一方面,由于它是关于 digits 的,你可以说它是关于数字的文本表示。
【解决方案3】:

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

【讨论】:

  • 转换为 int32 将再次赋予字符值!
【解决方案4】:

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

应该是:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-08
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多