乍一看就是大数乘法问题,只需要维护3个整型数组分别为乘数,被乘数,积。要通过可不是那么容易。需要考虑的问题有:
1.大数的幂每次需要记录前一次运算的结果并将结果保存乘数里面,但积数组需要清0。
2.笔者的解题思路是先计算整数的大数乘幂,但在此之前记录小数点的位置,最后输出的时候准确定位小数点即可(这点非常麻烦)。
3.题目要求清除前后导0,所以对于10.000 1 10.000 2这样的数据需要注意。
4.对于纯小数的幂注意输出格式。
5.任何数的1次方为其本身,题目没有考虑数的0次方为1。
代码如下:
<pre name="code" class="cpp">/*
arthur: Near_zh
data: 2014/7/30
note: poj-1001
*/
#include <iostream>
#include <string>
using namespace std;
int result[99999], a[99999], b[99999];
int main()
{
string str;
int n;
int i=0;
int j;
int lena;
int lenb;
int dot;//小数点
int num;
int count;
while(cin>>str>>n)
{
if(n>1)
{
lenb=lena=5;
memset(result, 0, sizeof(result));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
num=n;
n--;
count=0;
for(i=lena,j=1;i>=0;i--)//将字符型数转换成数字,低位存在数组的低位
{
count++;
if(str[i]=='.')
{
dot=i;
continue;
}
a[j]=str[i]-'0';
b[j]=a[j];
j++;
}
while(n--)
{
for(i=1;i<=lena;i++)
for(j=1;j<=lenb;j++)
{
result[i+j-1]+=b[j]*a[i];
if (result[i+j-1]>9)
{
result[i+j] += result[i+j-1] / 10;
result[i+j-1] %= 10;
}
}
if (result[lena+lenb-1]>9)
{
result[lena+lenb] += result[lena+lenb-1] / 10;
result[lena+lenb-1] %= 10;
}
lena = lena + lenb;
for (i=1; i<=lena; i++)
a[i] = result[i];
if(n!=0)
{
for(i=1;i<=lena;i++)
result[i]=0;//对结果初始化
}
}
for(i=lena;i>=0;i--)
{
if(result[i]!=0)
break;
}
for(j=1;j<=lena-dot*num+1;j++)
{
if(result[j]!=0)
break;
}
int flag1=i;
int flag2=j;
dot=5-dot;
dot=dot*num;
if (flag1<dot) flag1 = dot;
if (flag2>dot) flag2 = dot + 1;
for(i=flag1;i>=flag2;i--)
{
if(i==dot)
cout<<".";
cout<<result[i];
}
}
else
{
for(i=str.size()-1;i>=0;i--)
{
if(str[i]!='0')
break;
}
int k=i;
for(i=0;i<=k;i++)
{
if(str[i]=='.')
continue;
cout<<str[i];
}
}
cout<<endl;
}
return 0;
}