郭某人的第一篇博客——关于水高精 发表于 2020-03-12 | 字数统计: 911 | 阅读时长 ≈ 5 python打表很友好,是在不行直接python水以上只是个人bb。。。进入主题高精度主要就是模拟,小学数学中的进位,这个划重点,然后最后注意处理前缀0就ok了,以下是个人总结的高精代码。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203#include<iostream>#include<algorithm> using namespace std;typedef long long LL;const int maxn=1010;string s1,s2;//高精度读入 //高精度算法一般是数组下标为0则存个位数 void read(string s,int *a){ reverse(s.begin(),s.end()); for(int i=0;i<s.size();i++) a[i]=s[i]-'0';}//高精度输出 void print(int *a,int len){ int i=len; while(a[i]==0) i--; for(;i>=0;i--) printf("%d",a[i]);}//高精度比较大小 way1直接比较字符串//返回值为1说明s1大,-1说明s1小,0表示相等 int pd1(string s1,string s2){ if(s1.size()!=s2.size()) return s1.size()>s2.size() ? 1:-1; else{ if(s1==s2) return 0; for(int i=0;i<s1.size();i++) { int t=s1[i]-s2[i]; if(t==0) continue; else if(t>0) return 1; else if(t<0) return -1; } }}//高精度比较大小 way2比较数组 int pd2(int *a,int len_a,int *b,int len_b){ if(len_a!=len_b) return len_a>len_b ? 1:-1; else{ for(int i=len_a-1;i>=0;i--) { if(a[i]==b[i]) continue; else return a[i]>b[i] ? 1:-1; } } return 0;}int add(int *a,int len_a,int *b,int len_b,int *ans){ if(len_a<len_b) return add(b,len_b,a,len_a,ans); int temp[maxn+1],t=0; for(int i=0;i<len_a;i++) { t+=a[i]; if(i<len_b) t+=b[i]; ans[i]=t%10; t/=10; } if(t!=0){ ans[len_a]=t; return len_a+1; } return len_a;}//个人想法,配合pd函数,事半公倍 //a-b,限制条件且a>=b void sub(int *a,int len_a,int *b,int len_b,int *ans){ int tt[maxn]; for(int i=len_a-1;i>=0;i--) tt[i]=a[i]; for(int i=0;i<len_a;i++) { if(i>=len_b){ if(tt[i]>=0) ans[i]=tt[i]; else{ ans[i]=tt[i]+10; tt[i+1]--; } } else{ int t=0; t=tt[i]-b[i]; if(t>=0) ans[i]=t; else{ tt[i+1]--; ans[i]=t+10; } } }}void mul(int *a,int len_a,int *b,int len_b,int *ans){ for(int i=0;i<len_a;i++) { for(int j=0;j<len_b;j++) ans[i+j]+=a[i]*b[j]; } for(int i=0;i<len_a+len_b;i++) { if(ans[i]>=10) {//关键步骤,进位(我是一个不晓得如何压位的弟弟) ans[i+1]+=ans[i]/10; ans[i]%=10; } }}//高精度除以低精度,并返回余数 void div1(int *a,int len_a,LL k,LL &r,int *ans){ r=0; for(int i=len_a-1;i>=0;i--) { r=r*10+a[i]; ans[i]=r/k; r%=k; }}int main(){ int a[maxn],b[maxn]; int c[2*maxn]; cin>>s1>>s2; read(s1,a); read(s2,b); int len_a=s1.size(),len_b=s2.size(); int ans[maxn+1]; int ans2[maxn]; int k=add(a,s1.size(),b,s2.size(),ans); print(ans,k); printf("\n"); //sub(a,b) a-b if(pd2(a,len_a,b,len_b)==1) { sub(a,len_a,b,len_b,ans2); print(ans2,len_a); }else if(pd2(a,len_a,b,len_b)==-1) { sub(b,len_b,a,len_a,ans2); printf("-"); print(ans2,len_b); }else printf("0"); printf("\n"); for(int i=4;i>=0;i--) printf("%d",a[i]); printf("\n"); for(int i=4;i>=0;i--) printf("%d",b[i]); printf("\n"); print(a,len_a); printf("\n"); print(b,len_b); printf("\n"); //mul(a,b) int ans3[2*maxn]; mul(a,len_a,b,len_b,ans3); print(ans3,len_a+len_b); printf("\n"); if(pd1(s1,s2)==1) printf("s1>s2\n"); else if(pd1(s1,s2)==-1) printf("s1<s2\n"); else printf("s1==s2\n"); print(a,s1.size()); print(b,s2.size()); if(pd2(a,s1.size(),b,s2.size())==1) printf("s1>s2\n"); else if(pd2(a,s1.size(),b,s2.size())==-1) printf("s1<s2\n"); else printf("s1==s2\n"); int ans4[maxn]; LL kk=12,r; div1(a,len_a,kk,r,ans4); print(ans4,len_a); printf("\n%lld\n",r); return 0;} -------------本文结束感谢您这么好看还看我的文章-------------