| ||||||||||
| 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