#C语言 #include <math.h> #include <stdio.h> #include <string.h> void reverse(char a[],int n) { int m=n; char *c=(char*)malloc(sizeof(char)*400); int i=0; while (n>=0) { c[i]=a[n]; n--; i++; } for(int i=0;i<=m;i++) { a[i]=c[i]; } } void add(char a[],char b[],int s,int v) { int w=0; char c[800]; int left=0; while(w<=s||w<=v) { if(w<=s&&w<=v) { int t_c=(a[w]-'0')+(b[w]-'0')+left; left=0; if(t_c>=10) { left=1; c[w]=t_c-10+'0'; } else c[w]=t_c+'0'; } else if(w>s&&w<=v) { int t_c=+(b[w]-'0')+left; left=0; if(t_c>=10) { left=1; c[w]=t_c-10+'0'; } else c[w]=t_c+'0'; } else if(w>v&&w<=s) { int t_c=(a[w]-'0')+left; left=0; if(t_c>=10) { left=1; c[w]=t_c-10+'0'; } else c[w]=t_c+'0'; } w++; } if(left==1)c[w]='1'; else w--; for(int j=w;j>=0;j--) { printf("%c",c[j]); } printf("\n"); } void sub(char a[],char b[],int s,int v) { int w=0; char c[800]; char lend[400]; char belend[400]; if(s>v) { for (int i=0; i<=s; i++) { lend[i]=a[i]; } for (int i=0; i<=v; i++) { belend[i]=b[i]; } } else if(s<v) { printf("-"); int temp=s; s=v; v=temp; for (int i=0; i<=s; i++) { lend[i]=b[i]; } for (int i=0; i<=v; i++) { belend[i]=a[i]; } } else if(s==v) { int flag=0; //printf("s:%d\n",s); //printf("lend:%d,belend:%d\n",lend[0],belend[0]); for(int i=s;i>=0;i--) { if(a[i]>b[i]) { flag=0; break; } else if(a[i]<b[i]) { flag=1; break; } } //printf("flag:%d\n",flag); if(flag==1) { printf("-"); int temp=s; s=v; v=temp; for (int i=0; i<=s; i++) { lend[i]=b[i]; } for (int i=0; i<=v; i++) { belend[i]=a[i]; } } if(flag==0) { for (int i=0; i<=s; i++) { lend[i]=a[i]; } for (int i=0; i<=v; i++) { belend[i]=b[i]; } } } while(w<=s||w<=v) { if(w<=s&&w<=v) { //printf("w:%d\n",w); int t_c=(lend[w]-'0')-(belend[w]-'0'); //printf("t_c:%d,lend:%d,belend:%d",t_c,lend[w],belend[w]); if(t_c<0) { int l=w+1; while(lend[l]<1) { lend[l]=9; l++; } c[w]=t_c+10+'0'; lend[l]=lend[l]-1; } else c[w]=t_c+'0'; } else if(w>v&&w<=s) { c[w]=lend[w]; } w++; } w--; int flag=0; for(int j=w;j>=0;j--) { if(flag==0&&c[j]=='0') { continue; } else { printf("%c",c[j]); flag=1; } } if (flag==0) { printf("0"); } printf("\n"); } void mtp(char a[],char b[],int s,int v) { int w=0; char c[800]; int c2[800]={0}; int left=0; int sum=0; for(int i=0;i<=s;i++) { for(int j=0;j<=v;j++) { c2[i+j-1+2]+=(a[i]-'0')*(b[j]-'0'); //if(i+j+1==32)printf("c2[%d+%d+1]:%d,a[%d]:%d,b[%d]:%d\n",i,j,c2[i+j+1],i,a[i]-'0',j,b[j]-'0'); } } for (int i=1; i<=s+v+2; i++) { c2[i]+=left; left=0; if(c2[i]>=10) { left=c2[i]/10; c2[i]=c2[i]%10; } // printf("i:%d,c2:%d\n",i,c2[i]); } if(c2[s+v+2]!=0)printf("%d",c2[s+v+2]); for (int i=s+v-1+2; i>=1; i--) { printf("%d",c2[i]); } } int main() { char a[400]; char b[400]; scanf("%s",a); scanf("%s",b); int la=strlen(a)-1; int lb=strlen(b)-1; reverse(a,la); reverse(b,lb); add(a, b, la, lb); sub(a, b, la, lb); mtp(a, b, la, lb); }
最主要是减法要分清正负,可以先比较两个数大小,大的做被减数小的做减数