在C#中的大数运算的问题
我一直想做个大数运算的类,最近查了资料,看了文章,然后自己模仿别人的代码写了一个 BigInt 类。运算上似乎没有问题,因为无法验证——我的 BigInt 在输出上出了问题。我无法将 BigInt 表示的数有效的转换为字符串输出(输入方面没有问题),系统老是说堆栈溢出。哪位高手能帮忙看看出了什么问题。
仿照的是 afanty 的 CBigInt 类,由于我今年刚高中毕业,什么C#、VB.NET都是刚起步,连C都没有系统的学,所以不懂自己到底翻译对没有(其它部分省略,有必要时在给),希望有人能指正:
原示例的输出代码(C/C++):
// CBigInt.h 文件
...
#define DEC 10
...
// CBigInt.cpp 文件
//将 BigInt 输出为字符串
int CBigInt::OutPutToStr(CString& str, const unsigned int system=DEC)
{
str="";
char ch;
CBigInt X;
X.Mov(*this);
while(X.m_ulvalue[X.m_nLength-1]>0)
{
ch=X.Mod(system)+48;
str.Insert(0,ch);
X.Mov(X.Div(system));
}
return 0;
}
---------------------------------------------------
我的代码(C#,隐式转换):
int DEC=10;
// 在其他运算中,我用重载运算符(+,-,*,/,%,>、<、==、!=)来代替它的
// Add,Sub,Mul,Div,Mod,Cmp 方法;
// 符号我规定 1 为正,0 = 0 ,-1 为负。而且用 sbyte 替代 它的int
// 用赋值代替它的 Mov 方法。
// 重载了转换允许 BigInt 和 int/uint/long/ulong 等转换
/// <summary>
/// 允许将 int 变量隐式转换为大数 BigInt。
/// </summary>
/// <param name="a"> 要转换的 int 变量。</param>
/// <returns> 转换后的大数实例。</returns>
public static implicit operator BigInt(int a){
BigInt x=new BigInt();
x.m_ulValue[0]=(uint)Math.Abs(a);
x.Sign=(sbyte)Math.Sign(a);
x.nLength=1;
return x;
}
/// <summary>
/// 允许将 BigInt 实例隐式转换为 string 输出。
/// </summary>
/// <param name="x"> 要转换的 BigInt 变量。</param>
/// <returns> 转换后的大数实例。</returns>
public static implicit operator string(BigInt x){
string str="";
char ch;
while(x.m_ulValue[x.m_nLength-1] > 0) {
ch=(char)(int)(x % (BigInt)DEC + 48);
str = ch + str;
x/= DEC ;
}
return str;
}