|
发表于 2005-11-15 11:57:46
|
显示全部楼层
那就得寻找表示更大的数的方法
好像有个叫做gmp的库可以表示任意精度的数
但是我研究了一段时间还是不大会用
我自己写了一个程序可以表示几千位的数,而且实现了其加减乘除乘方等基本运算
但是效率很低
我是用一个数组来表示一个数的
如a[1000]表示一个1000位的数
a[0]代表这个数的位数,a[1]表示个位,a[2]表示十位,a[a[0]]表示最高位
以下为摘抄的乘法的算法
BOOL MyMath::Mult(int aTmp[], int bTmp[], int cTmp[])
{
BigNum bgRes;
BigNum bgTmp;
BigNum bgTTmp;
bgTmp.m_a[0] = aTmp[0];
for(int ib=1;ib<=bTmp[0];ib++)
{
bgTmp.Clear();
for(int ia=1;ia<=aTmp[0];ia++)
{
bgTmp.m_a[ia] = aTmp[ia]*bTmp[ib];
}
ZZH(bgTmp.m_a);
fz(bgTTmp.m_a, bgTmp.m_a);
for(int ibB=1;ibB<ib;ibB++)
{
Mult10(bgTTmp.m_a, bgTTmp.m_a);
}
Add(bgRes.m_a, bgTTmp.m_a, bgRes.m_a);
}
fz(cTmp, bgRes.m_a);
return TRUE;
}
/*
* dst = src*10
添加日期: 2005-01-21 21:58
*/
BOOL MyMath::Mult10(int srcTmp[], int dstTmp[])
{
BigNum bgI;
fz(bgI.m_a, srcTmp);
for(int i=bgI.m_a[0]+1;i>1;i--)
{
dstTmp[i] = bgI.m_a[i-1];
}
dstTmp[1] = 0;
dstTmp[0] = bgI.m_a[0] + 1;
return TRUE;
} |
|