高精度口诀(别问我这是从哪里来的,你在网上找不到是因为这就是我写的)
:-)
1.高精度加法:相加进位再去零
2.高精度减法:判断相减再去零
3.高精度乘法:相乘预估再去零
4.高低精乘法:相乘进位再去零
#include<iostream> #include<cstring> using namespace std; class BIGINT{ public: int num[505]; int length; bool positive; BIGINT(string str=""){ memset(num, 0, sizeof(num)); positive = true; if(str == ""){ return; } else{ length = str.length(); for(int i = 0; i<str.length(); i++){ num[i] = str[str.length()-i-1]-'0'; } } } void show(){ if(positive == false){ cout<<"-"; } for(int i = length-1; i>=0; i--){ cout<<num[i]; } } }; int compare(BIGINT &a,BIGINT &b){ if(a.length > b.length){ return 1; } else if(a.length < b.length){ return -1; } else{ int maxlen = max(a.length,b.length); for(int i = maxlen-1; i>=0; i--){ if(a.num[i] > b.num[i]){ return 1; } else if(a.num[i] < b.num[i]){ return -1; } } return 0; } } BIGINT bigadd(BIGINT &a,BIGINT &b){ BIGINT c; int maxlen = max(a.length,b.length); //相加 for(int i = 0;i<maxlen;i++){ c.num[i] = a.num[i] + b.num[i]; } //进位 for(int i = 0;i<maxlen;i++){ if(c.num[i]>=10){ c.num[i+1] += 1; c.num[i] = c.num[i] % 10; } } //去零 if(c.num[maxlen] == 0){ c.length = maxlen; } else{ c.length = maxlen + 1; } return c; } BIGINT bigminus(BIGINT &a,BIGINT &b){ BIGINT c; int maxlen = max(a.length,b.length); //判断 int maxint = compare(a,b); if(maxint == 1){ //相减 for(int i = 0;i<a.length;i++){ if(a.num[i]>=b.num[i]){ c.num[i] = a.num[i] - b.num[i]; } else{ a.num[i+1] -= 1; a.num[i] += 10; c.num[i] = a.num[i] - b.num[i]; } } } else if(maxint == -1){ c = bigminus(b,a); c.positive = false; } //去零 for(int i = maxlen+1;i>=0;i--){ if(c.num[i] != 0){ c.length = i+1; return c; } } c.length = 1; return c; } BIGINT bigmultiply(BIGINT &a,BIGINT &b){ BIGINT c; //相乘 for(int i = 0;i<a.length;i++){ for(int j = 0;j<b.length;j++){ c.num[i+j] += a.num[i]*b.num[j]; c.num[i+j+1] += c.num[i+j]/10; c.num[i+j] %= 10; } } //预估 int len = a.length + b.length; //去零 for(int i = len+1;i>=0;i--){ if(c.num[i] != 0){ c.length = i+1; return c; } } c.length = 1; return c; } BIGINT bigmultiplywithsmall(BIGINT a,int b){ //相乘 for(int i = 0;i<a.length;i++){ a.num[i] *= b; } //进位 for(int i = 0;i<a.length+1;i++){ if(a.num[i]>=10){ a.num[i+1] += a.num[i] / 10; a.num[i] %= 10; } } //去零 if(a.num[a.length] != 0){ a.length += 1; } return a; } int main(){ BIGINT a("111111111"); BIGINT b("111111111"); BIGINT tmp; tmp = bigadd(a,b); cout<<"高精度加法:"; tmp.show(); cout<<endl; tmp = bigminus(a,b); cout<<"高精度减法:"; tmp.show(); cout<<endl; tmp = bigmultiply(a,b); cout<<"高精度乘法:"; tmp.show(); cout<<endl; tmp = bigmultiplywithsmall(a,100); cout<<"高低精乘法:"; tmp.show(); cout<<endl; }
高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。