UVa OJ
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.
This problem requires that you write a program to compute the exact value of Rn where R is a real number (0.0 < R < 99.999) and n is an integer such that .
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
还有就是我没有在每次乘完之后处理前置0。以后注意
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<ctype.h> #include<cmath> int digit,t,len,mul[300]; char num[10],str[10],numb[300]; using namespace std; int exp(int t) { memset(mul,0,sizeof(mul)); int i,j,lenb=strlen(numb); if (t==1) return 0; for (i=0; i<len; i++) { for (j=0; j<=lenb; j++) { if (isdigit(num[i]) && isdigit(numb[j])) mul[i+j]+=(num[i]-'0')*(numb[j]-'0'); if (mul[i+j]>=10) { mul[i+j+1]+=mul[i+j]/10; mul[i+j]%=10; } } } for (i=0; i<=len+lenb+3; i++) numb[i]=mul[i]+48; numb[i]='\0'; exp(t-1); } int main () { int i,j,k; while(scanf("%s %d",str,&t)!=EOF) { memset(mul,0,sizeof(mul)); memset(num,0,sizeof(num)); memset(numb,0,sizeof(numb)); len=strlen(str); for (i=len-1,j=0; i>=0; i--) if (isdigit(str[i])) num[j++]=str[i]; else k=i; num[j]='\0'; digit=5-k; len--; strcpy(numb,num); exp(t); digit*=t; for (i=strlen(numb); i>=digit; i--) if (numb[i]!='0' && isdigit(numb[i])) break; for (j=i; j>=digit; j--) printf("%c",numb[j]); cout<<"."; for (i=0; ; i++) if (numb[i]!='0') break; for (j=digit-1; j>=i; j--) printf("%c",numb[j]); cout<<endl; } return 0; }