Problem : Exponentiation
Description:题目的意思很好懂,给出一个0.0-99.999之间的数,然后给出一个n,求这个数的n次方。
Solution:看到数据这么大就知道用正常的int型肯定没办法做到。所以我们需要把输入的数一个一个的存进一个int型的数组,然后像我们笔算乘法一样,一个一个数字的去乘。例如我们算1234×1234的时候就会列以下算式。
我们在做这个题的时候也是这样,模拟我们列算式计算。
Code(C++):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string s;
int n,a[1000],b[10];
int ans[1000];
int sum[1000];
int i,j,k,t,right1;
int doc,length1,length2;
int doc1,doct;
int main()
{
while(cin>>s>>n)
{
t=0;
doc=-1;doc1=-1;
right1=0;
int length=s.size();
for(i=length-1; i>=0; i--)
{
if(s.at(i)=='.')
{
doc=i;
continue;
}
a[t]=s.at(i)-'0';
b[t]=s.at(i)-'0';
t++;
}
//去掉尾部多余的零
if(doc==-1)
length1=length2=t;
else
{
for(i=0; i<t; i++)
{
if(i<(t-doc)&&a[i]==0)
continue;
else
{
doc1=i;
break;
}
}
for(; i<t; i++)
{
a[right1]=a[i];
b[right1]=a[i];
right1++;
}
length1=length2=right1;
}
doct=(length-doc-doc1-1)*n;
if(n==1)
{
for(i=length1-1; i>=0; i--)
cout<<a[i];
cout<<endl;
continue;
}
else if(n==0)
{
cout<<"0"<<endl;
continue;
}
//这里减一是因为我们算平方时,只需要乘一次,三次方时也只需要乘两次,以此类推,所以需要减一
n-=1;
while(n--)
{
int r=0;
memset(sum,0,sizeof(sum));
for(i=0; i<length1; i++)
{
for(j=0; j<length2; j++)
{
sum[i+j]+=a[i]*b[j]+r;
if(sum[i+length2-1]>9)
{
sum[i+length2]=sum[i+length2-1]/10;
sum[i+length2-1]%=10;
}
r=sum[i+j]/10;
sum[i+j]=sum[i+j]%10;
}
}
if(sum[length1+length2-1]>9)
{
sum[length1+length2]=sum[length1+length2-1]/10;
sum[length1+length2-1]%=10;
}
length1+=length2;
for(i=0; i<length1; i++)
a[i]=sum[i];
}
//去掉前边多余的零
for(i=length1;i>=0;i--)
{
if(sum[i]==0&&i>=doct)
continue;
else
break;
}
for(; i>=0; i--)
{
if(i==doct-1)
cout<<".";
cout<<sum[i];
}
cout<<endl;
}
return 0;
}