高精度算法
高精度算法,就是利用竖式的计算方法,一位位的计算。
总体来说有以下几点需要注意:
1 不要忘记删除前导0
2 用字符型读入并将其-48转为int型存储
3 不要忘记进位退位
4 高精减的时候不要忘记比较大小
高精度加法
#include<bits/stdc++.h> using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100]; int a1_len,b1_len,lenc,i,x; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1); gets(b1); //输入加数与被加数 a1_len=strlen(a1); b1_len=strlen(b1); for (i=0;i<=a1_len-1;i++) { a[a1_len-i]=a1[i]-48; //将操作数放入a数组 } for (i=0;i<=b1_len-1;i++) { b[b1_len-i]=b1[i]-48; //将操作数放入b数组 } lenc =1; x=0; while(lenc <=a1_len || lenc <=b1_len)//相加并进位 { c[lenc]=a[lenc]+b[lenc]+x; x=c[lenc]/10; c[lenc]=c[lenc]%10; lenc++; } c[lenc]=x; if (c[lenc]==0) { lenc--; //去除前导0 } for (i=lenc;i>=1;i--) { cout<<c[i]; //输出结果 } cout<<endl; return 0; }
高精度减法
#include<bits/stdc++.h> using namespace std; bool cmp(char a[],char b[]) { if(strlen(a)>strlen(b)) return true; if(strlen(a)<strlen(b)) return false; if(strlen(a)==strlen(b)) { if(strcmp(a,b)>0) return true; else return false; } } int main() { char a[1000],b[1000]; int a1[1000]={0},b1[1000]={0},c[1000]={0},i,len1,len2,l; scanf("%s %s",a,b); len1=strlen(a); len2=strlen(b); l=len1>len2?len1:len2; for(i=0;i<len1;i++) a1[i]=a[len1-1-i]-'0'; for(i=0;i<len2;i++) b1[i]=b[len2-1-i]-'0'; if(cmp(a,b)) { for(i=0;i<l;i++) { c[i]+=a1[i]-b1[i]; if(c[i]<0) { c[i+1]--; c[i]+=10; } } if(c[l]<0) c[l]--; for(i=l-1;i>=0;i--) cout<<c[i]; cout<<endl; } else { for(i=0;i<l;i++) { c[i]+=b1[i]-a1[i]; if(c[i]<0) { c[i+1]--; c[i]+=10; } } if(c[l]<0) l--; cout<<"-"; for(i=l-1;i>=0;i--) cout<<c[i]; cout<<endl; } }
高精度乘法
#include<bits/stdc++.h> using namespace std; const int maxn=4005; string mul(string str1,string str2); int main() { string a,b; cin>>a>>b; cout<<mul(a,b)<<endl; return 0; } string mul(string str1,string str2) { int len1=str1.size(); int len2=str2.size(); string str=""; int i,j,a[maxn],b[maxn],c[maxn]; for(i=0;i<len1;i++) a[i]=int(str1[len1-1-i]-'0'); for(i=0;i<len2;i++) b[i]=int(str2[len2-1-i]-'0'); for(i=0;i<len1;i++) for(j=0;j<len2;j++) { c[i+j]+=a[i]*b[j]; c[i+j+1]+=c[i+j]/10; c[i+j]=c[i+j]%10; } int len3=len1+len2; while(len3>1&&c[len3-1]==0) len3--; for(i=0;i<len3;i++) str=char(c[i]+'0')+str; return str; }
高精度除法:然而并不常用。