【问题标题】:Sum of digits of a number in C#?C#中数字的位数之和?
【发布时间】:2014-05-14 17:16:01
【问题描述】:

我正在尝试编写一个对数字的数字求和的代码,它应该可以工作,但我找不到我做错的地方,我在 Python 中有一个工作代码,我试图这样做在 C# 中也是这样,但是.. 这是两个代码

Python:

number = "12346546"
summ=0
for i in number:
    summ+=int(i)
print summ

C#:

string num = "2342";
int sum = 0;

for (int i = 0; i < num.Length; i++)
{
    int number = Convert.ToInt32(num[i]);
    sum += number;
}
Console.WriteLine(sum);

编辑:我使用了调试器,我发现当我转换数字时,它们变成了完全不同的数字,但是如果我转换整个字符串,那么它会正确转换......如何解决这个问题?

【问题讨论】:

  • for 循环中的错字:尝试 "i
  • -1 -- 你甚至没有描述你的问题。如果您收到错误,请将其粘贴 到问题中。如果你得到一个意外的输出粘贴你得到的输出写出预期的输出。
  • Bakuriu 感谢您指出这一点,但我实际上在帖子末尾做了“编辑:”,但显然这并不是真正必要的,因为几秒钟后,几个用户告诉我我的错误在哪里在我设法编辑我的帖子之前。

标签: c# python sum digits


【解决方案1】:

num[i]charConvert.ToInt32 将返回字符的 ASCII 码,而不是实际的数值。使用:

int number = Convert.ToInt32(num[i].ToString());

还将i &lt; num.Length-1 更改为i &lt; num.Length

编辑:为了更清楚,这里有一个例子:

int n1 = Convert.ToInt32('0'); // Uses Convert.ToInt32(char) result -> 48
int n2 = (int) '0'; // cast from char to int result -> 48
int n3 = Convert.ToInt32("0"); // Uses Convert.ToInt32(string) result -> 0

【讨论】:

  • 是的,谢谢我注意到,一旦我使用了您的转换方法,它现在就可以工作了! :) 感谢 ASCII 解释,我原以为原因是相似的。
  • 只是一个澄清的问题: num[i].ToString() 采用第 i 个元素并将其转换为 String ,使其完全独立于原始字符串,这就是为什么现在它可以正确转换?
  • @Darkbound 是的,当您将其转换为字符串时,您使用的是 this Convert.ToInt32 的重载,这就是它给出预期结果的原因
【解决方案2】:

替换Convert.ToInt32(num[i])

通过

Convert.ToInt32(num[i].ToString())

否则,您将获得一个 ascii 值...(因为 num[i]char

msdn

【讨论】:

    【解决方案3】:

    C# 字符串的末尾没有 null,因此您不必担心它,因此循环中不需要“-1”。但是,有一个更简单的方法:

    string num = "2342";
    int sum = num.ToCharArray().Select(i => int.Parse(i.ToString())).Sum();
    

    这会将字符串转换为字符数组,将它们全部转换为整数(在此过程中返回IEnumerable&lt;int&gt;),然后返回它们的总和。

    【讨论】:

    • C# 字符串的末尾有 没有 null。
    • @TimS。澄清。感谢您的反馈!
    • 这将无法编译,int.Parse 需要一个 string 类型参数,并且您正在尝试传递一个字符。另外,不需要ToCharArray,你也可以在字符串上应用LINQ。
    • @Habib,是的,忘记了字符上的 .ToString。我不知道 String 上的“Sum”函数,这将是一种更短的(尽管对那些不知道该函数的人来说可能不太清楚)做同样事情的方式。
    • @Habib,每天学习新东西...感谢您提供的信息
    【解决方案4】:

    Convert.ToInt32(num[i]); 会给你字符数字的 ASCII 值。例如对于字符1,您将得到49

    使用char.GetNumericValue 喜欢:

    for (int i = 0; i < num.Length; i++)
    {
        int number = (int) char.GetNumericValue((num[i]));
        sum += number;
    }
    

    您还需要修改循环以继续到 Length,因为您使用的是&lt;

    如果你想使用 LINQ,那么你可以这样做:

    int sum = num.Select(r => (int)char.GetNumericValue(r)).Sum();
    

    【讨论】:

      【解决方案5】:

      使用 Linq 的单行解决方案:

      string num = "2342";
      int sum = num.Sum(c=> Convert.ToInt32(c.ToString()));
      

      这是一个小提琴:https://dotnetfiddle.net/3jt7G6

      【讨论】:

      • 我看不出这将如何对数字求和
      • @BradleyDotNET 我很高兴澄清你没有看到什么。看看小提琴
      • 我现在看到了,不知道 .String 上有这样一个函数可以使用这样的选择器!感谢您的提琴,我也可以链接 String.Sum 文档。
      • @BradleyDotNET Sum 实际上是 IEnumerable 上的扩展方法,当您使用 System.Linq msdn.microsoft.com/en-us/library/vstudio/… 时可用
      • 我不知道String继承了IEnumerable,谢谢你的信息!
      【解决方案6】:

      你可以组合一些东西。

      您可以使用 Linq (Sum() is a Linq method) 从 string 中选择 chars 的集合。

      您仍然需要将这些字符转换为数字;您可以通过将字符转换为字符串并对其进行解析来做到这一点,或者您可以使用其他内置方法。

      var sum = num.Sum(i => Char.GetNumericValue(i));
      

      【讨论】:

        【解决方案7】:

        char 的核心只是一个数字。它恰好是一个代表字符的数字。

        以下是一些突出这一点的解决方案:

        int sum = num.Sum(c => c) - '0' * num.Length;
        
        // or
        
        int sum = 0;    
        for (int i = 0; i < num.Length; i++)
        {
            sum += num[i] - '0';
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多