一、高精度数的输入输出
char ci[maxn],cj[maxn]; scanf("%s",ci+1); scanf("%s",cj+1); int len1=strlen(ci+1); int len2=strlen(cj+1); a.w[0]=len1; for (int i=1;i<=len1;i++) a.w[i]=ci[len1-i+1]-'0';//反着记录 b.w[0]=len2; for (int i=1;i<=len2;i++) b.w[i]=cj[len2-i+1]-'0';
二、高精度+高精度
hp jia(hp a,hp b) { hp c; if (a.w[0]>b.w[0]) c.w[0]=a.w[0]+1; else c.w[0]=b.w[0]+1; for (int i=1;i<=c.w[0];i++) c.w[i]=0; for (int i=1;i<c.w[0];i++)//< not <= { c.w[i]+=a.w[i]+b.w[i];//+= c.w[i+1]+=c.w[i]/10;//+= c.w[i]=c.w[i]%10; } while (c.w[0]!=0&&c.w[c.w[0]]==0) c.w[0]--; return c; }
三、高精度-高精度
1、判断正负
bool bj(hp a,hp b) { if (a.w[0]<b.w[0]) return false; for (int i=1;i<=a.w[0];i++) if (b.w[0]>a.w[0]) return false; return true; }
if (bj(a,b)) x=jian(a,b); else { cout<<"-"; x=jian(b,a); }
2、减法
hp jian(hp a,hp b) { hp c; c.w[0]=a.w[0]; for(int i=1;i<=c.w[0];i++) c.w[i]=0; for (int i=1;i<=c.w[0];i++) { if (a.w[i]<b.w[i]){ a.w[i]+=10; a.w[i+1]--; } c.w[i]=a.w[i]-b.w[i]; } while (c.w[0]>0&&c.w[c.w[0]]==0) c.w[0]--; return c; }
三、高精度*高精度
hp cheng(hp a,hp b) { hp c; c.w[0]=a.w[0]+b.w[0]; for (int i=1;i<=c.w[0];i++) c.w[i]=0; for (int i=1;i<=a.w[0];i++) for (int j=1;j<=b.w[0];j++) { c.w[i+j-1]+=a.w[i]*b.w[j]; c.w[i+j]+=c.w[i+j-1]/10; c.w[i+j-1]=c.w[i+j-1]%10; } while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--; return c; }
四、高精度/高精度
1、按位相减 之 numcpy:用456/12,在第一位4的时候/120
void numcpy(hp &t,int id) { for (int i=1;i<=b.w[0];i++) t.w[i+id-1]=b.w[i]; t.w[0]=b.w[0]+id-1; }
2、按位相减:相应位数商+1
hp chu(hp a,hp b) { hp c; c.w[0]=a.w[0]-b.w[0]+1; for (int i=1;i<=c.w[0];i++) c.w[i]=0; for (int i=c.w[0];i>=1;i--) { hp tmp; tmp.w[0]=b.w[0]+i-1; for (int j=1;j<=tmp.w[0];j++) tmp.w[j]=0; numcpy(tmp,i); while (bj(a,tmp)) { c.w[i]++;jian(a,tmp); } } while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--; return c; }
3、减法的过程(与高精减高精不同,要修改a)
bool bj(hp a,hp b) { if (a.w[0]<b.w[0]) return false; else if (a.w[0]>b.w[0]) return true; int cnt=0; for (int i=a.w[0];i>=1;i--)//顺序 { if (a.w[i]>b.w[i]) return true; if (a.w[i]<b.w[i]) return false; } return true; } void jian(hp & a,hp b) { for (int i=1;i<=b.w[0];i++)//b.w[0] { if(a.w[i]<b.w[i]) { a.w[i+1]--;//a.w[i]-- not b a.w[i]+=10; } a.w[i]-=b.w[i]; } while (a.w[0]>=1&&a.w[a.w[0]]==0) a.w[0]--;//修改a }