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,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]=' ';
exp(t-1);
}
int main ()
{
int i,k;
while(scanf("%s %d",str,&t)!=EOF)
{
memset(mul,sizeof(mul));
memset(num,sizeof(num));
memset(numb,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]=' ';
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;
}