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

haha,AC了

Posted by RichardXu at 2013-10-31 12:26:36 on Problem 1001
/*考虑大数乘法和大数乘幂.
大数乘法我没有优化,达到了0(n^2)
大数乘幂优化了一下,x^n= x*(x^2)*(x^4)*....  ()内的为临时计算项
另外需要注意底数为0和整数的时候,没有考虑负数。 指数也不考虑0和负数。*/
/*cacluate R^n accurately*/
#include <stdio.h>

#define MAX_DIGITS	180

int NumOut[MAX_DIGITS];
int NumIn1[MAX_DIGITS];
int NumIn2[MAX_DIGITS];

int StringToDecimal(char *pStr,int *pNum,int *pLength);
int LargeIntegerMultiply(int *pNum1,int len1,int *pNum2,int len2,int *pNumOut);
int LargeIntegerPow(int *pNumIn,int lenIn,int exp,int *pNumOut);

int main(void)
{
	char string[6];
	int exponent,length,decimalbits,beginprint;
	int i,j;

	while(scanf("%s %d",string,&exponent)!=EOF){
		//convert the string to integer
		decimalbits = StringToDecimal(string,NumIn1,&length);
		//process 0
		if((length==1) &&(NumIn1[0]==0)){
			printf("0\r\n");			
			continue;
		}

		length=LargeIntegerPow(NumIn1,length,exponent,NumOut);			
		decimalbits *= exponent;
		
		//output the interger part
		i=length-1;
		if(length>decimalbits){
			beginprint=0;
			while(i>=decimalbits){
				if((NumOut[i]!=0)||(beginprint==1)){	//omit the prefix 0s
					beginprint=1;
					printf("%d",NumOut[i]);
				}
				--i;		
			}
		}
		//output the decimal part
		if(decimalbits!=0){
			printf(".");
			//we need to remove the trailing 0s
			//find trailing 0's num
			j=0;
			while(NumOut[j]==0){
				++j;
			}	
			while(i>=j){
				printf("%d",NumOut[i]);
				--i;
			}
		}
		printf("\r\n");
	}
	return 0;
}

int StringToDecimal(char *pStr,int *pNum,int *pLength)
{
	int decimalbits,beginexp,isZero,isInteger;
	int k,tmp;
	int bits=0;

	beginexp = 0;
	decimalbits = 0;
	while(*pStr){
		if(*pStr=='.'){
			beginexp=1;	
		}else{
			pNum[bits]=*pStr-'0';	//convert to digit
			++bits;
			if(beginexp){
				++decimalbits;
			}
		}
		++pStr;
	}
	
	//reverse the num bits order
	k=0;	
	while(k<(bits>>1)){
		tmp = pNum[k];
		pNum[k]=pNum[bits-1-k];
		pNum[bits-1-k]=tmp;
		++k;
	}
	
	//check whether the decimal part is needed???
	isZero=1;
	isInteger=1;
	for(k=0;k<decimalbits;++k){
		if(pNum[k]!=0){
			isInteger=0;
			isZero=0;
			break;
		}
	}
	if(isInteger==1){
		for(k=decimalbits;k<bits;++k){
			if(pNum[k]!=0){
				isZero=0;
				break;
			}
		}
	}

	if(isZero==1){
		*pLength=1;	//only one value 0
		pNum[0]=0;
		decimalbits=0;	//no decimal part
	}else if(isInteger==1){
		*pLength=bits-decimalbits;
		for(k=decimalbits;k<bits;++k){
			pNum[k-decimalbits]=pNum[k];
		}
		decimalbits=0;
	}else{
		*pLength=bits;
	}
	return decimalbits;
}

int LargeIntegerMultiply(int *pNum1,int len1,int *pNum2,int len2,int *pNumOut)
{
	int i,j;
	for(i=0;i<len1+len2;++i){	//clear the output num
		pNumOut[i]=0;
	}
	for(i=0;i<len1;++i){
		for(j=0;j<len2;++j){
			pNumOut[i+j] += pNum1[i]*pNum2[j];
		}
	}
	for(i=0;i<len1+len2-1;++i){
		if(pNumOut[i]>=10){
			pNumOut[i+1] += pNumOut[i]/10;
			pNumOut[i] %= 10;
		}
	}
	if(pNumOut[len1+len2-1]!=0)
		return len1+len2;
	else
		return len1+len2-1;
}

//Notice: all the numbers should be non-negative
int LargeIntegerPow(int *pNumIn,int lenIn,int exp,int *pNumOut)
{
	int i,j;
	int lenOut;
	int *pNumIn2 = NumIn2;

	lenOut=1;
	pNumOut[0]=1;
	while(exp!=0){
		if(exp & 0x01){
			lenOut=LargeIntegerMultiply(pNumOut,lenOut,pNumIn,lenIn,pNumIn2);
			for(i=0;i<lenOut;++i){
				pNumOut[i]=pNumIn2[i];
			}
		}
		if(exp!=1){
			lenIn=LargeIntegerMultiply(pNumIn,lenIn,pNumIn,lenIn,pNumIn2);
			for(i=0;i<lenIn;++i){
				pNumIn[i]=pNumIn2[i];
			}
		}
		exp >>=1;
	}
	return lenOut;
}

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