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 |
我是使用C语言写的。数组开到了50000 才AC 我第一次开了10000害我W一次#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 50000 int BigIntTrim(char value[]); int BigIntEqual(char value1[],char value2[]); int BigIntSub(char data1[],char data2[]); int BigIntAdd(char value1[],char value2[]); int main(){ int n,i; char add1[N],add2[N],sign1,sign2; while(scanf("%d",&n)==1&&n!=EOF){ for(i=0;i<n;i++){ scanf("%s",add1); scanf("%s",add2); sign1=add1[0];sign2=add2[0]; if(sign1!='-'&&sign1!='+'&&sign2!='-'&&sign2!='+'){ //不带符号 BigIntAdd(add1,add2); printf("%s\n",add1); }else{ if((sign1=='+'||sign1=='-')&&(sign2=='+'||sign2=='-')){ //两个符号 strcpy(add1,&add1[1]);strcpy(add2,&add2[1]); if(sign1=='+'&&sign2=='+'){ //两个符号都是正号 BigIntAdd(add1,add2); printf("%s\n",add1); }else{ if(sign1=='-'&&sign2=='-'){ //两个符号都是负号 BigIntAdd(add1,add2); if(strcmp(add1,"0")) printf("%c%s\n",sign1,add1); else printf("%s\n",add1); }else{ if(sign1=='+'&&sign2=='-'){ //第一个符号是正号,第二个符号是付好 if(BigIntEqual(add1,add2)!=-1){ BigIntSub(add1,add2); printf("%s\n",add1); }else{ BigIntSub(add2,add1); printf("%c%s\n",sign2,add2); } }else{ //第一个符号是负号,第二个符号是正号 if(BigIntEqual(add2,add1)!=-1){ BigIntSub(add2,add1); printf("%s\n",add2); }else{ BigIntSub(add1,add2); printf("%c%s\n",sign1,add1); } } } } }else{ //一个符号 if(sign1=='+'||sign1=='-'){ //第一个数带符号 strcpy(add1,&add1[1]); if(sign1=='+'){//第一个数是正号 BigIntAdd(add1,add2); printf("%s\n",add1); }else{//第一个数是符号 if(BigIntEqual(add2,add1)!=-1){ BigIntSub(add2,add1); printf("%s\n",add2); }else{ BigIntSub(add1,add2); printf("%c%s\n",sign1,add1); } } }else{//第二个数带符号 strcpy(add2,&add2[1]); if(sign2=='+'){//第二个数是正号 BigIntAdd(add1,add2); printf("%s\n",add1); }else{//第二个数是负号 if(BigIntEqual(add1,add2)!=-1){ BigIntSub(add1,add2); printf("%s\n",add1); }else{ BigIntSub(add2,add1); printf("%c%s\n",sign2,add2); } } } } } } } return 0; } int BigIntTrim(char value[]){ int i,len=strlen(value); for(i=0;value[i];i++) if(value[i]!='0') break; if(i==len) strcpy(value,"0"); else strcpy(value,&value[i]); return 0; } int BigIntEqual(char value1[],char value2[]){ int len1,len2; len1=(int)strlen(value1);len2=(int)strlen(value2); if(len1>len2) return 1; else if(len1<len2) return -1; else return strcmp(value1,value2); } int BigIntSub(char data1[],char data2[]){ int value1,value2; int i,len1,len2,flag; char *data,*sub1,*sub2; len1=(int)strlen(data1); len2=(int)strlen(data2); sub1=(char *)malloc((len1+1)*sizeof(char)); sub2=(char *)malloc((len1+1)*sizeof(char)); data=(char *)malloc((len1+1)*sizeof(char)); for(i=0;i<len1;i++) sub2[i]='0'; data[i]='\0'; strcpy(sub1,data1); strcpy(sub2+(len1-len2),data2); for(i=len1-1,flag=0;i>=0;i--){ value1=sub1[i]-'0'+flag; value2=sub2[i]-'0'; if(value1-value2<0){ data[i]=value1+10-value2+'0'; flag=-1; }else{ data[i]=value1-value2+'0'; flag=0; } } BigIntTrim(data); strcpy(data1,data); free(sub1);free(sub2);free(data); return 0; } int BigIntAdd(char value1[],char value2[]){ int len1,len2,i,ans,unit,decate,data1,data2,data; char **mid; len1=(int)strlen(value1);len2=(int)strlen(value2); mid=(char **)malloc(3*sizeof(char *)); mid[0]=(char *)malloc((N+1)*sizeof(char)); for(i=0;i<N;i++)mid[0][i]='0'; mid[0][i]='\0'; for(i=1;i<3;i++){ mid[i]=(char *)malloc((N+1)*sizeof(char)); strcpy(mid[i],mid[0]); } strcpy(mid[0]+(N-1-len1),value1); strcpy(mid[1]+(N-1-len2),value2); for(i=N-2,unit=decate=0;i>=0;i--){ data1=mid[0][i]-'0'; data2=mid[1][i]-'0'; data=data1+data2+decate; unit=data%10; decate=data/10; mid[2][i+1]=unit+'0'; } BigIntTrim(mid[2]); strcpy(value1,mid[2]); free(mid[0]);free(mid[1]);free(mid[2]); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator