把题分成三部分:
1、把数字逆序存放,以方便乘法时从后一位乘起的规则,记下小数点的位置,在相乘时去掉小数点,在结果输出时再添加小数点;
2、用循环得数的幂次方(注意把每次相乘要放的数组清零);
3、输出(注意输出格式,如整数部分只有0时直接输出小数点,小数点后的末尾的0不要输出等)。
主要是把大数的每一位放在一个数组里存放
#include<iostream>
#include<cstring>
#define max 201
using namespace std;
int rr[max], rr1[max];
void Pow(int n, int *r, int len)
{
int len1,i,j,k,l,d;
len1=len;
for(i=1;i<n;i++) //以其幂为界限
{
for(j=0;j<len;j++)
{
for(k=0;k<len1;k++)
{
rr[j+k]+=r[j]*rr1[k]; //仿照数字相乘时进对位相乘
}
}
for(k=0;k<len+len1;k++)
{
if(rr[k]>9) //进位
{
rr[k+1]+=rr[k]/10;
rr[k]=rr[k]%10;
}
}
l=max-1;
while(rr[l]==0)
l--;
len1=l+1; //计算每一次相乘完的长度
for(d=0;d<len1;d++)
rr1[d]=rr[d];
memset(rr, 0, sizeof(rr)) ; //赋值后清零,以便下一次的相乘时的计算
}
}
void show(int point) //注意输出格式
{
int i,len,j,k,d;
i=max-1;
while(rr1[i]==0 && i>=0) //计算实际长度
i--;
len=i+1;
if(len==0) //如果全为0,则直接输出0
{
cout<<'0'<<endl;
return ;
}
if(point>len) //如果结果的小数点大于相乘得到的数字长度则先输出小数点,然后用0补不够的位数
{
cout<<'.';
for(j=0;j<point-len;j++)
cout<<'0';
}
k=0;
while(rr1[k]==0 && k<point) //计算小数点后且是末尾为0的长度
k++;
for(d = len-1; d>= k; d--)
{
if(d == point - 1) //找到小数点的位置,输出小数点
cout<<"." ;
cout<<rr1[d] ;
}
cout<<endl;
}
int main()
{
char m[7];
int r[5];
int n,i,point,len,j;
while (cin>>m>>n)
{
memset(rr, 0, sizeof(rr)) ;
memset(rr1, 0, sizeof(rr1)); //清零,以便输入下一组数据时用
point=0;
len=strlen(m);
j=0;
for(i=5;i>=0;i--)
{
if(m[i]=='.')
{
point=5-i; //计算小数点后的位数
len=len-1;
}
else
{
r[j]=m[i]-'0';
rr1[j]=m[i]-'0';
j++;
}
}
Pow(n, r, len) ;
show(point * n) ;
}
return 0;
}