高精加减乘

//高精加:模拟竖式,让两个数每一位对应加,满10就进一
//高精减:依旧模拟竖式,先比较减数和被减数的大小,如果减数>被减数,就让减数减去被减数,输出时加“-”
//高精乘:模拟竖式时要注意是两重循环,一个规律:c[i+j-1]=a[i]*b[j]+c[i+j-1]
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; char a1[10000],b1[10001]; int k,t,a[10001],b[10001],ans[100000001],c[10001]; void he() { int lenc=1,x=0; memset(ans,0,sizeof(ans)); while(lenc<=t||lenc<=k) { ans[lenc]=a[lenc]+b[lenc]+x; x=ans[lenc]/10; ans[lenc]%=10; lenc++; } ans[lenc]=x;if(ans[lenc]==0)lenc--; for(int i=lenc;i>=1;i--)cout<<ans[i];cout<<endl; } void cha(int a[],int b[])//此处a数组为被减数,b数组为减数 { memset(ans,0,sizeof(ans)); int lenc=1; while(lenc<=k||lenc<=t) { if(a[lenc]<b[lenc]) {a[lenc]+=10;a[lenc+1]--;} ans[lenc]=a[lenc]-b[lenc]; lenc++; } while(ans[lenc]==0&&lenc>1)lenc--; if(fl){for(int i=lenc;i>=1;i--)cout<<ans[i];cout<<endl; } } void ji() { memset(ans,0,sizeof(ans)); for(int i=1;i<=k;i++) { int x=0; for(int j=1;j<=t;j++) {ans[i+j-1]=a[i]*b[j]+x+ans[i+j-1]; x=ans[i+j-1]/10; ans[i+j-1]%=10; } ans[i+t]=x; } int lenc=k+t; while(ans[lenc]==0&&lenc>1)lenc--; for(int i=lenc;i>=1;i--)cout<<ans[i];cout<<endl; }int main() { scanf("%s",a1); scanf("%s",b1); k=strlen(a1); t=strlen(b1); for(int i=0;i<k;i++) a[k-i]=a1[i]-48; for(int i=0;i<t;i++) b[t-i]=b1[i]-48; a[0]=k;b[0]=t; he(); if(k<t||(k==t&&strcmp(a1,b1)<0))//比大小 {cout<<"-";cha(b,a); } else cha(a,b); ji(); }

 一个板子。嗯(小白书里有)

原文地址:https://www.cnblogs.com/lcez56jsy/p/10599039.html