繁体   English   中英

将char位数转换为int时,值不正确

[英]Incorrect values when converting char digits to int

我的最终目标是取一个像29的数字,将其拆开,然后将得到的两个整数相加。 因此,例如,如果数字是29,则答案将是2 + 9 = 11。

在调试时,我可以看到保留了这些值,但是在这种情况下,其他值似乎也不正确,即50、57。因此,我的答案是107。我不知道这些值从何而来而且我不知道从哪里开始修复它。

我的代码是:

class Program
{
    static void Main(string[] args)
    {
        int a = 29;
        int answer = addTwoDigits(a);
        Console.ReadLine();


    }
        public static int addTwoDigits(int n)
        {
            string number = n.ToString();
            char[] a = number.ToCharArray();
            int total = 0;

            for (int i = 0; i < a.Length; i++)
            {
                total = total + a[i];
            }
            return total;
        }

}

如前所述,代码的问题在于,当您将字符转换为int时,字符具有ASCII码值,该值与各种数字都不匹配。 不用弄乱字符串和字符,只需使用良好的旧数学即可。

public static int AddDigits(int n)
{
    int total = 0;
    while(n>0)
    {
        total += n % 10;
        n /= 10;
    }

    return total;
}

乘以10的模将导致最低有效数字,并且由于整数除法将n /= 10截断n /= 10将截断最低有效数字并最终在数字用尽时变为0。

您的代码实际上是将char的十进制值相加。
看看https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

小数2和9分别为50和57。 在进行加法之前,需要将char转换为int。

int val = (int)Char.GetNumericValue(a[i]);

您的问题是您要添加char值。 请记住,char是一个整数值,代表ASCII字符。 当你加入a[i] ,以total价值,你要添加的int表示该值char ,编译器自动将其丢。

问题在以下代码行中:

total = total + a[i];

上面的代码等于以下代码行:

total += (int)a[i];

// If a[i] = '2', the character value of the ASCII table is 50.
// Then, (int)a[i] = 50.

要解决您的问题,您必须通过以下方式更改该行:

total = (int)Char.GetNumericValue(a[i]);

// If a[i] = '2'.
// Then, (int)Char.GetNumericValue(int)a[i] = 2.

您可以看到此答案,以了解如何将数字值从char转换为int

在此页面上,您可以看到ASCII值表。

只是为了好玩,我想我可以看看是否可以使用LINQ在一行中完成它,这里是:

public static int AddWithLinq(int n)
{
    return n.ToString().Aggregate(0, (total, c) => total + int.Parse(c.ToString()));
}

我认为这不是特别“干净”的代码,但充其量是很有教育意义的!

尝试这个:

public static int addTwoDigits(int n)
    {
        string number = n.ToString();
        char[] a = number.ToCharArray();
        int total = 0;

        for (int i = 0; i < a.Length; i++)
        {
            total = total + (int)Char.GetNumericValue(a[i]);
        }
        return total;
    }

将数字转换为char始终返回ASCII代码。因此,您可以使用GetNumericValue()方法获取值而不是ASCII代码

你应该int.TryParse

  int num; 
 if (int.TryParse(a[i].ToString(), out num))
  {
      total += num; 
   }
public static int addTwoDigits(int n)
{
    string number = n.ToString()
    char[] a = number.ToCharArray();

    int total = 0;

    for (int i = 0; i < a.Length; i++)
    {
        total +=  Convert.ToInt32(number[i].ToString());
    }
    return total;
}

您无需将数字转换为字符串即可找到数字。 @juharr已经解释了如何在循环中计算数字和总数。 以下是递归版本:

int addDigit(int total,int n)
{
    return (n<10) ? total + n
                  : addDigit(total += n % 10,n /= 10);
}

可以使用addDigit(0,234233433)调用并返回27。如果n小于10,我们将计算最后一位。 否则,提取数字并将其添加到总数中,然后除以10并重复。

一个人可能会变得聪明,并使用currying摆脱最初的总数:

int addDigits(int i)=>addDigit(0,i);

addDigits(234233433)还返回27;

如果数字已经是一个字符串,则可以利用以下事实:可以将字符串视为Char数组,并且可以将char隐式转换为ints:

var total = "234233433".Sum(c=>c-'0');

只要总数不超过int.MaxValue ,就可以处理任意大的字符串,例如:

"99999999999999999999".Sum(x=>x-'0');  // 20 9s returns 180

除非数字已经是字符串形式,否则这将是无效的,也不会验证内容是否为实际数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM