【发布时间】:2017-03-17 15:10:00
【问题描述】:
我的任务是编写一个程序,使用循环将十六进制整数转换为其十进制形式。不要使用内置的 .NET 功能。
我已经编写了程序,它适用于除“4ED528CBB4”之外的所有测试,并且在“D”之后溢出。结果我用long,找不到问题。
string hexadecimal = Console.ReadLine();
long result = 0;
for (int i = 0; i < hexadecimal.Length; i++)
{
if (hexadecimal[hexadecimal.Length - i - 1] >= '0' && hexadecimal[hexadecimal.Length - i - 1] <= '9')
{
result += ((hexadecimal[hexadecimal.Length - i - 1] - '0') * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'D')
{
result += (13 * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'C')
{
result += (12 * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'A')
{
result += (10 * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'B')
{
result += (11 * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'F')
{
result += (15 * (int)Math.Pow(16, i));
}
else if (hexadecimal[hexadecimal.Length - i - 1] == 'E')
{
result += (14 * (int)Math.Pow(16, i));
}
}
Console.WriteLine(result);
}
}
【问题讨论】:
-
试试无符号整数
-
将你所有的演员表从
(int)更改为(long),它对我有用。此外,您可能想在操作周围添加checked(),这将在溢出时引发异常(如果溢出足够多,它将再次变为正数,您甚至可能不会注意到它溢出):result += checked((13 * (long)Math.Pow(16, i)));。我只是简单地看了看,但看起来13 * (int)Math.Pow()溢出了,int的演员表没问题,但乘以 13 被推到了int的限制之上。 -
为答案而战。我添加了
checked并将所有内容更改为long,现在出现了溢出消息。如何解决这样的问题? -
您在同一字符串上收到错误,
"4ED528CBB4"?您可能错过了(long)转换。搜索“(int)”并确保替换所有这些。在我这样做之后,我得到了与here 相同的答案,没有任何例外。 -
是的,我在第一种情况下漏掉了一个。现在它可以正常工作了。感谢您的帮助。