#include<stdio.h> #include<string.h> char a[320],b[320],sum[320]; int flag=0; #define N 320 void add(char a[320],char b[320],char back[320]) { int i,j,k,up,x,y,z,l; // char *c; // printf("aaaa"); if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2; // c=(char *) malloc(l*sizeof(char)); char c[350]; i=strlen(a)-1; j=strlen(b)-1; k=0;up=0; while(i>=0||j>=0) { if(i<0) x='0'; else x=a[i]; if(j<0) y='0'; else y=b[j]; z=x-'0'+y-'0'; if(up) z+=1; if(z>9) {up=1;z%=10;} else up=0; c[k++]=z+'0'; i--;j--; } if(up) c[k++]='1'; i=0; c[k]='/0'; for(k-=1;k>=0;k--) back[i++]=c[k]; back[i]='/0'; // printf("i=%d",i); // for(k=0;k<i;k++) // printf("%c",back[k]); } void sub(char s1[320],char s2[320],char t[320]) { int i,l2,l1,k; l2=strlen(s2);l1=strlen(s1); t[l1]='/0';l1--; for (i=l2-1;i>=0;i--,l1--) { if (s1[l1]-s2[i]>=0) t[l1]=s1[l1]-s2[i]+'0'; else { t[l1]=10+s1[l1]-s2[i]+'0'; s1[l1-1]=s1[l1-1]-1; } } k=l1; while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;} while(l1>=0) {t[l1]=s1[l1];l1--;} loop: if (t[0]=='0') { l1=strlen(s1); for (i=0;i<l1-1;i++) t[i]=t[i+1]; t[l1-1]='/0'; goto loop; } if (strlen(t)==0) {t[0]='0';t[1]='/0';} } void mult(char a[320],char b[320],char s[320]) { int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char result[65]; alen=strlen(a);blen=strlen(b); for (i=0;i<alen;i++) for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0'); for (i=alen-1;i>=0;i--) { for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j]; result[k]=sum%10; k=k+1; sum=sum/10; } for (i=blen-2;i>=0;i--) { for (j=0;j<=i;j++) sum=sum+res[i-j][j]; result[k]=sum%10; k=k+1; sum=sum/10; } if (sum!=0) {result[k]=sum;k=k+1;} for (i=0;i<k;i++) result[i]+='0'; for (i=k-1;i>=0;i--) s[i]=result[k-1-i]; s[k]='/0'; while(1) { if (strlen(s)!=strlen(a)&&s[0]=='0') strcpy(s,s+1); else break; } } int compare(char * c1,int s1,int e1,char *c2,int s2,int e2)/*大整数比较大小*/ { while(c1[s1]=='0'&&s1<e1)s1++; while(c2[s2]=='0'&&s2<e2)s2++; if(e1-s1>e2-s2)return 1; if(e1-s1<e2-s2)return -1; int i1;int f11=0; for(i1=0;i1<=e1-s1;i1++) { if(c1[s1+i1]>c2[s2+i1]){f11=1;break;} if(c2[s2+i1]>c1[s1+i1])break; } if(i1>e1-s1)return 0; if(f11)return 1; return -1; } void sub(char *c1,int l1,char *c2,int n,int l)/*两个大整数相减,结果放在c1中*/ { int fig=0; if(l1>l) { fig=1; int i5; for(i5=l;i5>0;i5--) c2[i5]=c2[i5-1]; c2[0]='0';l++; } int jw=0; int i4; char tc[N]; for(i4=l-1;i4>=0;i4--) { tc[i4]=((c2[i4]-48)*n+jw)%10+48; jw=((c2[i4]-48)*n+jw)/10; } jw=0; for(i4=l-1;i4>=0;i4--) { int ttt=jw; if(c1[i4]-tc[i4]-jw>=0) { tc[i4]=c1[i4]-tc[i4]-jw+48; jw=0; } else { jw=(tc[i4]-c1[i4]+jw); if(jw%10==0)jw/=10; else jw=jw/10+1; tc[i4]=jw*10+c1[i4]-tc[i4]-ttt+48; } } if(fig) { for(i4=0;i4<l-1;i4++)c2[i4]=c2[i4+1]; l--; c2[l]='/0'; } tc[l1]='/0'; for(i4=0;i4<=l1;i4++) c1[i4]=tc[i4]; } void high_precise_division(char *c1,char *c2) { int len1,len2; len1=strlen(c1); len2=strlen(c2); int i,j,k,ip; i=0; while(c1[i]=='0'&&i<len1-1)i++; for(j=0;i<len1;j++,i++)c1[j]=c1[i]; len1=j;c1[j]='/0'; i=0; while(c2[i]=='0'&&i<len2-1)i++; for(j=0;i<len2;j++,i++)c2[j]=c2[i]; len2=j;c2[j]='/0'; /*while(c1[0]=='0'&&i<len1-1) { for(k=0;k<len1-1;k++) c1[k]=c1[k+1]; len1--; }去掉前面的0*/ /*while(c2[0]=='0'&&j<len2-1) { for(k=0;k<len2-1;k++) c2[k]=c2[k+1]; len2--; }去掉前面的0*/ c1[len1]='/0'; c2[len2]='/0'; if(strcmp(c2,"0")==0)return ;/*当除数为0时*/ if(strcmp(c1,"0")==0){strcpy(c2,"0");return ;}/*当被除数为0时*/ if(len1<len2||len1==len2&&compare(c1,0,len1-1,c2,0,len2-1)<0) { strcpy(c2,c1); c1[0]='0';c1[1]='/0'; return ; } else { ip=0; char product[N],*pr;/*部分积*/ pr=product; for(ip=0;ip<len2-1;ip++) pr[ip]=c1[ip]; for(i=0;i<=len1-len2;i++) { pr[ip++]=c1[len2-1+i]; if(ip>=len2&&compare(pr,0,ip-1,c2,0,len2-1)>=0) { char tc[N]; for(j=1;j<=9;j++) { for(k=0;k<ip;k++)tc[k]=pr[k]; sub(tc,ip,c2,j,len2);/*pr-c2*j结果放在pr中*/ for(k=0;tc[k]!='/0';k++); if(compare(tc,0,k-1,c2,0,len2-1)<0) break; } strcpy(pr,tc); ip=strlen(pr); c1[i]=j+48; while(pr[0]=='0'&&ip>1) { for(j=0;j<ip-1;j++) pr[j]=pr[j+1]; ip--; } if(ip==1&&pr[0]=='0')ip--; } else c1[i]='0'; } while(c1[0]=='0') { for(j=0;j<i-1;j++) c1[j]=c1[j+1]; i--; } c1[i]='/0'; if(ip==0){pr[0]='0';pr[1]='/0';ip=1;} else { while(pr[0]=='0'&&ip>1) { for(j=0;j<ip-1;j++)pr[j]=pr[j+1]; ip--; } } for(j=0;j<ip;j++) c2[j]=pr[j]; c2[ip]='/0'; return ; } } void div(char a[320],char b[320]) { char *pc1,*pc2; pc1=a;pc2=b; a[strlen(a)]='/0'; b[strlen(b)]='/0'; // if(strcmp(b,"0")==0) {printf("除数不能为0/n");continue;} high_precise_division(pc1,pc2);/*结果放在pC1中,余数放在pC2中*/ printf("%s %s/n",pc1,pc2); } int main() { char d; int i; int l1,l2; memset(a,'0',sizeof(a)); memset(b,'0',sizeof(b)); memset(sum,'0',sizeof(sum)); while(scanf("%s %c %s",&a,&d,&b)!=EOF) { flag=0; if(d=='+') add(a,b,sum); else if(d=='-') { l2=strlen(b);l1=strlen(a); if(l2>l1||(l2==l1&&strcmp(b,a)>0)) flag=1; if(flag==0) sub(a,b,sum); if(flag==1) sub(b,a,sum); } else if(d=='*') mult(a,b,sum); else if(d=='/') { div(a,b); continue; } int l=strlen(sum); if(flag==0) { for(i=0;i<l;i++) printf("%c",sum[i]); printf("/n"); } if(flag==1) { printf("-"); for(i=0;i<l;i++) printf("%c",sum[i]); printf("/n"); } memset(a,'/0',sizeof(a)); memset(b,'/0',sizeof(b)); memset(sum,'/0',sizeof(sum)); } return 0; }