我已经开始开发一个BigInt类了,现在我被卡住了。 问题是,当我尝试添加两个不同长度的数字时,结果不正确。 例如,123 + 1将返回223。 我知道问题所在,但我需要帮助修复它。
public static BigInt operator +(BigInt n1, BigInt n2)
{
Stack<char> sNew = new Stack<char>();
Stack<char> sTemp = new Stack<char>();
int currentDigit1, currentDigit2, sum;
int carry = 0;
//insert the digits, XXXyyy + ZZZ = first insert ___yyy and then calculate XXX+ZZZ
if (n1.GetLength() > n2.GetLength())
{
while (n1.GetLength() > n2.GetLength())
sNew.Push(n1.sDigits.Pop());
}
else if (n2.GetLength() > n1.GetLength())
{
while (n2.GetLength() > n1.GetLength())
sNew.Push(n2.sDigits.Pop());
}
while (n1.sDigits.Count > 0)
{
currentDigit1 = int.Parse(n1.sDigits.Pop().ToString());
currentDigit2 = int.Parse(n2.sDigits.Pop().ToString());
sum = currentDigit1 + currentDigit2 + carry;
carry = 0;
if (sum > 10)
{
carry = 1;
sum = sum % 10;
}
sNew.Push(char.Parse(sum.ToString()));
}
//if there is a carry, for example 95+18
if (carry > 0)
sNew.Push(char.Parse(carry.ToString()));
//flip the stack
while (sNew.Count > 0)
sTemp.Push(sNew.Pop());
while (sTemp.Count > 0)
sNew.Push(sTemp.Pop());
return new BigInt(sNew);
}
无论这个问题是什么,这种类设计的模式是否有效?设计这类课程有更好的想法吗?
答案 0 :(得分:1)
这是一个相当浪费的表示,使用全八位表示一个十进制数字 - 大约60%的空间浪费!
即使您继续使用此表示形式,也应考虑将内部表示形式从Stack<char>
切换为List<char>
,最低有效数字存储在0
位置,存储在位置1
的十位,依此类推。这将允许您使用单个循环实现添加,如果两个数字都可用,则在相同位置添加数字,或者将进位添加到较长数字的数字。
更好的表示是使用base-256系统,并将单个“数字”存储为字节数组。
请注意,添加并不是最棘手的操作:等到你遇到乘法和除法!要了解您需要解决的复杂性,请下载Java's implementation of BigInteger
。
我假设你这样做是为了好玩,而不是作为一个真实项目的一部分。否则,没有理由不使用.NET的BigInteger
的内置表示。