高精度加法
//简单高精度加法 不考虑符号
const int N=100; int len,a[N+1],b[N+1]; void Init(int a[]) { string s; cin>>s,a[0]=s.size(); FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0'; //逆序储存 } void Solve() { len=a[0]>b[0]?a[0]:b[0],len++; //注意答案的位数 FORa(i,1,len) { a[i]+=b[i]; if(a[i]>=0) a[i+1]+=a[i]/10,a[i]%=10;//最好不要这样写(a[i+1]+=a[i]/10,a[i]%=10),这样会无形增加时间复杂度 } while(!a[len]&&len>1) len--; //以防输出无答案 FORs(i,len,1) printf("%d",a[i]);//因为储存的问题,逆序输出 } int main() { Init(a),Init(b),Solve(); return 0; }
高精度减法
const int N=100; int len,a[N+1],b[N+1]; void Init(int a[]) { string s; cin>>s,a[0]=s.size(); FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0'; } void Solve() { len=a[0]; FORs(i,a[0],1) { a[i]-=b[i]; if(a[i]<0) a[i+1]--,a[i]+=10; } while(!a[len]&&len>1) len--; FORs(i,len,1) printf("%d",a[i]); } int main() { Init(a),Init(b),Solve(); return 0; }
高精度乘法
const int N=100; int len,a[N+1],b[N+1],c[2*N+2]; void Init(int a[]) { string s; cin>>s,a[0]=s.size(); FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0'; } void Solve() { len=a[0]+b[0]+1; FORa(i,1,a[0]) FORa(j,1,b[0]) c[i+j-1]+=a[i]*b[j]; //在科学文社出版社出版的信息学奥赛一本通中(新手推荐),简单高精好像有一点问题。 FORa(i,1,len) if(c[i]>=10) c[i+1]+=c[i]/10,c[i]%=10; //先处理,后进位 while(!c[len]&&len>1) len--; FORs(i,len,1) printf("%d",c[i]); } int main() { Init(a),Init(b),Solve(); return 0; }
高精度除法
const int N=100; int len,a[N+1],c[N+1],b; void Init(int a[]) { string s; cin>>s,a[0]=s.size(); FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0'; } void Solve() { int x=0,len=a[0]; FORs(i,a[0],1) x=(x*10+a[i]),c[i]=x/b,x%=b; //注意解决方式与加减乘不同,需要从头开始, while(!c[len]&&len>1) len--; FORs(i,len,1) printf("%d",c[i]); printf(" %d",x); } int main() { Init(a),scanf("%d",&b),Solve(); return 0; }