[英]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.