高精度
加法:
void r_move(char *s) { for(ri i=strlen(s)-1,j=M-1;i>=0;j--,i--) { s[j]=s[i]-48; s[i]=0; } } void l_move(char *s) { int i=0; while(s[i]==0) i++; for(ri j=0;i<=M-1;i++,j++) { s[j]=s[i]+48; s[i]=0; } } void add(char *s1,char *s2,char *ans) { int len1=strlen(s1); int len2=strlen(s2); int len=max(len1,len2); r_move(s1); r_move(s2); for(ri i=M-1;i>=M-len;i--) { ans[i]+=s1[i]+s2[i]; ans[i-1]+=ans[i]/10; ans[i]=ans[i]%10; } l_move(ans); }
减法:用 自己写的 cmp
#include <bits/stdc++.h> using namespace std; const int M = 10005; const int N = 10005; #define ri register int char s1[M],s2[M],ans[M]; void r_move(char *s) { for(ri i=M-1,j=strlen(s)-1;j>=0;j--,i--) { s[i]=s[j]-48; s[j]=0; } } void l_move(char *s) { int i=0; while(ans[i]==0) i++; for(ri j=0;i<=M-1;i++,j++) { ans[j]=ans[i]+48; ans[i]=0; } } void jian(char *s1,char *s2,char *ans) { int len1=strlen(s1); int len2=strlen(s2); int len=max(len1,len2); r_move(s1); r_move(s2); for(ri i=M-1;i>=M-len;i--) { ans[i]+=s1[i]-s2[i]; if(ans[i]<0) ans[i]+=10,ans[i-1]-=1; } l_move(ans); } int cmp(char *s1,char *s2) { if(strlen(s1)<strlen(s2)) return -1; if(strlen(s1)>strlen(s2)) return 1; return strcmp(s1,s2); } int main(){ scanf("%s%s",s1,s2); if(cmp(s1,s2)<0) { jian(s2,s1,ans); printf("-%s\n",ans); return 0; } else { if(cmp(s1,s2)>0) { jian(s1,s2,ans); printf("%s\n",ans); return 0; } else { printf("0\n"); return 0; } } }
乘法:在左移的时候注意 i==j的情况 i
void l_move(char *ans,int len) { int i=0; while(ans[i]==0&&i<len) i++; if(i>=len) memset(ans,0,sizeof ans),ans[0]='0'; else { for(ri j=0;i<len;i++,j++) { ans[j]=ans[i]+48; if(j!=i) ans[i]=0; } } } void mul(char *s1,char *s2,char *ans) { for(ri i=0;i<strlen(s1);i++) { for(ri j=0;j<strlen(s2);j++) { ans[i+j+1]+=(s1[i]-48)*(s2[j]-48); } for(ri j=strlen(s1)+strlen(s2);j>0;j--) ans[j-1]+=ans[j]/10,ans[j]=ans[j]%10; } l_move(ans,strlen(s1)+strlen(s2)); }
除法:
int mycmp(char *s,char *s2,int star,int end) { int len2=strlen(s2); int len=end-star+1; if(len>len2) return 1; else if(len<len2) return -1; else return strncmp(s+star,s2,len2); } void _chu(char *s,char *s2,char *ans) { int star=0; int len=strlen(s); int len2=strlen(s2); while(1) { int end=star+len2-1; while(end<len&&mycmp(s,s2,star,end)<0) end++; if(end>=len) break; while(mycmp(s,s2,star,end)>=0) //end<len&& { for(int i=end,j=len2-1;j>=0;j--,i--) { if(s[i]-s2[j]<0) { s[i]+=10; s[i-1]--; } s[i]=s[i]-s2[j]+48; } ans[end]++; while(star<len&&s[star]=='0') star++; } } int i=0; while(i<len&&ans[i]==0) i++; if(i>=len) printf("0\n"); else { while(i<len) printf("%c",ans[i++]+48); printf("\n"); } i=0; while(i<len&&s[i]=='0') i++; if(i>=len) printf("0"); else { while(i<len) printf("%c",s[i++]); } }