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 |
Congratulations!In Reply To:haha,AC了 Posted by:RichardXu at 2013-10-31 12:26:36 > /*考虑大数乘法和大数乘幂. > 大数乘法我没有优化,达到了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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator