UVa OJ
Exponentiation
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 .
Input
The input will consist of a set of pairs of values for R and n . The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.Output
The output will consist of one line for each line of input giving the exact value of R n . Leading zeros and insignificant trailing zeros should be suppressed in the output.Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
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;
}