Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
终于过了!#include <iostream> #include <string.h> #include <stdio.h> #define max(x,y) ((x)>(y)?(x):(y)) using namespace std; char s1[510],s2[510],s[1010]; int t; //加法:Add(int A[],int a,int B[],int b,int C[],int &c) //参数:相加的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。 //返回:无。相加的结果保存在C[]中,结果的位数保存在c中 void Add(int A[],int a,int B[],int b,int C[],int &c) { int i,j,k,*p,*q; if(a<b) k=a,a=b,b=k,p=B,q=A; else p=A,q=B; for(C[0]=0,c=a,i=1;i<=a;i++) C[i]=p[i]; for(i=a,j=b;j>=1;j--,i--) C[i]+=q[j]; for(i=a;i>=0;i--)C[i-1]+=C[i]/10,C[i]%=10; if(C[0]) for(c++,i=c;i>=1;i--) C[i]=C[i-1]; for(i=1;!C[i]&&i<=c;i++); k=i,c-=i-1; for(i=1;i<=c;i++) C[i]=C[k+i-1]; if(c<=0) c=1,C[1]=0; } void add() { int A[510],a,B[510],b,C[510],c,i; a=strlen(s1); for(i=0;i<a;i++) A[i+1]=s1[i]-'0'; b=strlen(s2); for(i=0;i<b;i++) B[i+1]=s2[i]-'0'; Add(A,a,B,b,C,c); int t=max(a,max(b+1,c)); for(i=1;i<=t-a;i++) putchar(' ');puts(s1); for(i=1;i<=t-(b+1);i++) putchar(' ');putchar('+');puts(s2); for(i=1;i<=t;i++) putchar('-');puts(""); for(i=1;i<=t-c;i++) putchar(' '); for(i=1;i<=c;i++) printf("%d",C[i]);puts(""); } //减法:void Sub(int A[],int a,int B[],int b,int C[],int &c) //参数:相减的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。 //返回:无。相减的结果保存在C[]中,结果的位数保存在c中。结果为负,C[0]=-1,结果为正C[0]=1,结果为0C[0]=0。 void Sub(int A[],int a,int B[],int b,int C[],int &c) { int i,j,k,flag,*p,*q; if(a==b) { flag=0; for(i=1;i<=a;i++) { if(A[i]>B[i])flag=1; if(A[i]<B[i])flag=-1; if(flag) break; } } if(a>b) flag=1; if(a<b) flag=-1; if(!flag) { C[0]=0,c=1;C[1]=0; return; } if(flag==1) p=A,q=B; else p=B,q=A,k=a,a=b,b=k; for(i=1;i<=a;i++) C[i]=p[i]; for(i=a,j=b;j>=1;j--,i--) { if(C[i]>=q[j]) C[i]-=q[j]; else C[i]=C[i]+10-q[j],C[i-1]--; } for(;i>=1&&C[i]<0;i--) C[i]+=10,C[i-1]--; for(i=1;!C[i]&&i<=a;i++); k=i,c=a-i+1; for(i=1;i<=c;i++) C[i]=C[k+i-1]; C[0]=flag; } void sub() { int A[510],a,B[510],b,C[510],c,i; a=strlen(s1); for(i=0;i<a;i++) A[i+1]=s1[i]-'0'; b=strlen(s2); for(i=0;i<b;i++) B[i+1]=s2[i]-'0'; Sub(A,a,B,b,C,c); int t=max(a,max(b+1,c)); for(i=1;i<=t-a;i++) putchar(' ');puts(s1); for(i=1;i<=t-(b+1);i++) putchar(' ');putchar('-');puts(s2); for(i=1;i<=t-max(b+1,c);i++) putchar(' '); for(i=1;i<=max(b+1,c);i++) putchar('-');puts(""); for(i=1;i<=t-c;i++) putchar(' '); for(i=1;i<=c;i++) printf("%d",C[i]);puts(""); } //(1)乘法:void Mul(int A[],int a,int B[],int b,int C[],int &c) //参数:相乘的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。 //返回:无。相乘的结果保存在C[]中(C[1]…C[c]),结果的位数保存在c中。 void Mul(int A[],int a,int B[],int b,int C[],int &c) { int i,j,k; for(i=0;i<=a+b;i++) C[i]=0; for(i=a;i>=1;i--) for(j=b;j>=1;j--) C[i+j]+=A[i]*B[j]; for(i=a+b;i>1;i--)C[i-1]+=C[i]/10,C[i]%=10; for(i=0;!C[i]&&i<=a+b;i++); k=i,c=a+b-i+1; for(i=1;i<=c;i++) C[i]=C[k+i-1]; if(c<=0) c=1,C[1]=0; } int C[510][1010]; void mul() { int A[510],a,B[510],b,ans[1010],x,c[510],temp,i,j,t=0,k; a=strlen(s1); for(i=0;i<a;i++) A[i+1]=s1[i]-'0'; b=1; temp=strlen(s2); for(i=0;i<temp;i++) { B[1]=s2[i]-'0'; Mul(A,a,B,b,C[i],c[i]); t=max(t,temp-1-i+c[i]); } k=t; t=max(t,max(a,temp+1)); for(i=0;i<temp;i++) B[i+1]=s2[i]-'0'; Mul(A,a,B,temp,ans,x); t=max(t,x); for(i=1;i<=t-a;i++) putchar(' ');puts(s1); for(i=1;i<=t-(temp+1);i++) putchar(' ');putchar('*');puts(s2); if(temp==1) { for(i=1;i<=t-max(k,temp+1);i++) putchar(' '); for(i=1;i<=max(k,temp+1);i++) putchar('-');puts(""); } else { for(i=1;i<=t-max(c[temp-1],temp+1);i++) putchar(' '); for(i=1;i<=max(c[temp-1],temp+1);i++) putchar('-');puts(""); } for(i=temp-1;i>=0;i--) { for(j=1;j<=t-(temp-1-i+c[i]);j++) putchar(' '); for(j=1;j<=c[i];j++) printf("%d",C[i][j]);puts(""); } if(temp>1) { for(i=1;i<=t-max(k,x);i++) putchar(' '); for(i=1;i<=max(k,x);i++) putchar('-');puts(""); for(i=1;i<=t-x;i++) putchar(' '); for(i=1;i<=x;i++) printf("%d",ans[i]);puts(""); } } int main() { for(scanf("%d",&t);t--;) { scanf("%s",s); int i,len=strlen(s); for(i=0;i<len;i++) if(s[i]=='+'||s[i]=='-'||s[i]=='*') break; char c=s[i]; s[i]='\0'; strcpy(s1,s); strcpy(s2,s+i+1); if(c=='+') add(); else if(c=='-') sub(); else mul(); puts(""); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator