#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ‘ ‘; while(ch < ‘0‘ || ch > ‘9‘) last = ch , ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) ans = ans * 10 +ch - ‘0‘ , ch = getchar(); if(last == ‘-‘) ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar(‘-‘); x = -x; } if(x == 0) { putchar(‘0‘); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar(‘0‘ + q[nn]), --nn; } int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j; char s[N],s1[N],s2[N]; int main() { freopen("bigadd.in","r",stdin); freopen("bigadd.out","w",stdout); scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i = 0 ; i < n1 ; i ++) a[i] = (int)s1[n1 - i - 1] - (int)‘0‘; for(i = 0 ; i < n2 ; i ++) b[i] = (int)s2[n2 - i - 1] - (int)‘0‘; for(i = 0 ; i < n1 ; i ++) { x = 0; c[i] += a[i] + b[i] + x; x = c[i] / 10; c[i] = c[i] % 10; c[i + 1] = x; } n3 = n1 + n2; while(c[n3] == 0 && n3 > 0) n3--; yxz(i , n3 , 0) put(c[i]); return 0; }
emmm……在循环加法的时候只循环了第一位数,所以只要有第二个数的位数大于第一个就j了。23333
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ‘ ‘; while(ch < ‘0‘ || ch > ‘9‘) last = ch , ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) ans = ans * 10 +ch - ‘0‘ , ch = getchar(); if(last == ‘-‘) ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar(‘-‘); x = -x; } if(x == 0) { putchar(‘0‘); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar(‘0‘ + q[nn]), --nn; } int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j; char s[N],s1[N],s2[N]; int main() { freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i = 0 ; i < n1 ; i ++) a[i] = (int)s1[n1 - i - 1] - (int)‘0‘; for(i = 0 ; i < n2 ; i ++) b[i] = (int)s2[n2 - i - 1] - (int)‘0‘; for(i = 0 ; i < n1 ; i ++) { if(a[i] < b[i]) a[i] += 10,a[i + 1] = a[i + 1] - 1; c[i] = a[i] - b[i]; } n3 = n1 + n2; while(c[n3] == 0 && n3 > 0) n3--; yxz(i , n3 , 0) put(c[i]); return 0; }
这个高精度减法是删减版,有负数的情况还没判断,所以只要判断一下就行:
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #include <string> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ‘ ‘; while(ch < ‘0‘ || ch > ‘9‘) last = ch , ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) ans = ans * 10 +ch - ‘0‘ , ch = getchar(); if(last == ‘-‘) ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar(‘-‘); x = -x; } if(x == 0) { putchar(‘0‘); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar(‘0‘ + q[nn]), --nn; } char sa[N],sb[N]; int a[N],b[N],c[N]; int alen,blen,clen,i,j; int cmp(string a,string b) { if(strlen(sa)>strlen(sb))return 1; else if(strlen(sa)<strlen(sb))return -1; else { int i,l=strlen(sa); for(i=0;i<l;i++) { if(sa[i]>sb[i])return 1; else if(sa[i]<sb[i])return -1; } } return 0; } int main() { cin>>sa>>sb; if(cmp(sa,sb)==0) { put(0); return 0; } else if(cmp(sa,sb)==-1) { cout<<‘-‘; char t[N]; strcpy(t,sa); strcpy(sa,sb); strcpy(sb,t); } alen=strlen(sa); blen=strlen(sb); clen=max(alen,blen); for(i=0;i<alen;i++) a[alen-i]=sa[i]-‘0‘; for(i=0;i<blen;i++) b[blen-i]=sb[i]-‘0‘; for(i=1;i<=clen;i++) c[i]=a[i]-b[i]; for(i=1;i<=clen;i++) if(c[i]<0) c[i]+=10,c[i+1]--; while(c[clen]==0&&clen>1)clen--; for(i=clen;i>=1;i--) put(c[i]); cout<<endl; }
高精度乘法,很简单。