高精
高精加
#include<stdio.h> #include<stdlib.h> #include<iostream> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) using namespace std; const int N=100000; string sta,stb; int a[N+1],b[N+1],len; void Init(int a[],string &st) { cin>>st,a[0]=st.size(); FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0'; } int main() { Init(a,sta),Init(b,stb),len=a[0]>b[0]?a[0]:b[0]+1;//记得判断两者解的长度 FORa(i,1,len) a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10; while(!a[len]&&len>1) len--;//删除前导零 FORs(i,len,1) printf("%d",a[i]); return 0; }
高精减
#include<stdio.h> #include<stdlib.h> #include<iostream> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) using namespace std; const int N=100000; int a[N+1],b[N+1]; string sta,stb; void Init(int a[],string &st) { cin>>st,a[0]=st.size(); FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0'; } int main() { Init(a,sta),Init(b,stb); FORa(i,1,a[0]) { a[i]-=b[i]; if(a[i]<0) a[i+1]--,a[i]+=10;//借位 } while(!a[a[0]]&&a[0]>1) a[0]--;//删除前导零 FORs(i,a[0],1) printf("%d",a[i]); return 0; }
高精乘
#include<stdio.h> #include<stdlib.h> #include<iostream> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) using namespace std; const int N=1000; int a[N+1],b[N+1],c[N+1]; string sta,stb; void Init(int p[],string &s) { cin>>s,p[0]=s.size(); FORa(i,1,p[0]) p[i]=s[p[0]-i]-'0'; } int main() { Init(a,sta),Init(b,stb); FORa(i,1,a[0]) { int x=0; FORa(j,1,b[0]) c[i+j-1]=a[i]*b[j]+c[i+j-1]+x,x=c[i+j-1]/10,c[i+j-1]%=10;//加上本身与前者的进位与本应该加上的值 c[i+b[0]]=x;//别忘记处理进位的小尾巴 } c[0]=a[0]+b[0]+1; while(!c[c[0]]&&c[0]>1) c[0]--;//删除前导零 FORs(i,c[0],1) printf("%d",c[i]); return 0; }
高精除
#include<stdio.h> #include<stdlib.h> #include<iostream> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) using namespace std; const int N=1000; int a[N+1],b,c[N+1]; string s; void Init(int p[],string &s) { cin>>s,p[0]=s.size(); FORa(i,1,p[0]) p[i]=s[i-1]-'0';//存储方式与其它高精度处理不一样,正序储存 } int main() { int x=0; Init(a,s),scanf("%d",&b); FORa(i,1,a[0]) { c[i]=(x*10+a[i])/b;//注意商与余数要继承之前的答案 x=(x*10+a[i])%b; } int sp=1; while(!c[sp]&&sp<a[0]) sp++;//删除前导零,但因为储存方式的不一样,删除的方式也不一样 FORa(i,sp,a[0]) printf("%d",c[i]); return 0; }