Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我是使用C语言写的。数组开到了50000 才AC 我第一次开了10000害我W一次

Posted by chenjin1st at 2011-12-04 21:55:32 on Problem 2756
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator