加差法就不用说了,比较简单,乘法的实现也没有什么大的技巧,就是按照手工乘法的思想移位乘相加.对于除法略有技巧,根据减法思想使用提升位数的思想极大的减少了减法运行次数.
比如 9655/23 ,先根据它们之间的关系将23提升到2300(23*100,只提升位数),再做减法,循环直到被除数等于0或小于除数,同时按位相加中间提升次数即可得结果,另外一种方法和这个类似,只是提升的值不同,对于9655/23,可根据两个数之间关系得一个提升值6900(23*100*3,既提升位数又提升倍数的值,要做一次大整数乘法来求出提升后的值),然后和上面的思路一样,需要说明的是关于得到这个提升值,第一种办法相对固定,提升值也是一样的,对于后一种办法就比较复杂,不同的思路得到的提升值是不同的,由于我还没想到一个不错的提升算法,同时考虑到在我的程序中对这个大整数的存储方式是由高到低,既只提升位数时不用做任何运算,只是改变一下长度即可,另外按照其提升思路,同一位数的提升最坏情况下为9次,并做9次减法,相对后一种提升办法的最好情况是同一位数只提升一次并要做一次乘法,而做一次乘法的时间要远远高于做一次加法,所以我在程序中使用了前者的方法
我的第一种提升的算法思想
//
div1为被除数,div2为除数, 整数值由高位到低位依次放在m_int[]中
// result.length-1为首次提升位数
int len1 = div1.length,len2 = div2.length;
int i = 1 ;
for (i = 1 ;i <= len2;i ++ )
... {
if(div1.m_int[i]>div2.m_int[i])
...{
result.length=len1-len2+1;
break;
}
if(div1.m_int[i]<div2.m_int[i])
...{
result.length=len1-len2;
break;
}
}
if (i > len2)
result.length = len1 - len2 + 1 ;
// result.length-1为首次提升位数
int len1 = div1.length,len2 = div2.length;
int i = 1 ;
for (i = 1 ;i <= len2;i ++ )
... {
if(div1.m_int[i]>div2.m_int[i])
...{
result.length=len1-len2+1;
break;
}
if(div1.m_int[i]<div2.m_int[i])
...{
result.length=len1-len2;
break;
}
}
if (i > len2)
result.length = len1 - len2 + 1 ;
下面为详细代码
//
bigint.h
#include < iostream >
#include < string >
using namespace std;
const int maxsize = 1000 ;
class Cbigint
... {
private:
char m_int[maxsize];
int length;
public:
Cbigint(char *p=NULL);
Cbigint(const Cbigint &c);
Cbigint::Cbigint(long n);
void sinmult(
#include < iostream >
#include < string >
using namespace std;
const int maxsize = 1000 ;
class Cbigint
... {
private:
char m_int[maxsize];
int length;
public:
Cbigint(char *p=NULL);
Cbigint(const Cbigint &c);
Cbigint::Cbigint(long n);
void sinmult(