#include<iostream>
#include<string>
using namespace std;
string fun(string& s1, string& s2)
{
int size = s2.size()+s1.size();
char* pbuf2 = new char[size+1];
memset(pbuf2, '0', size);
pbuf2[size]='\0';
int s1dot = 0;
int dot[2]={0,0};
for(int i=(int)(s2.size()-1); i>=0; i--)
{
int s2dot = 0;
if(s2[i]=='.')
{
s1dot++;
dot[0]=(s2.size()-1)-i;
continue;
}
for(int j=(int)(s1.size()-1); j>=0; j--)
{
if(s1[j]=='.')
{
s2dot++;
dot[1]=(s1.size()-1)-j;
continue;
}
int ret = (s2[i]-'0')*(s1[j]-'0');
for(int endpos=i+j+1+s1dot+s2dot; endpos>=0 && ret>0; endpos--)//加,进位
{
ret += (*(pbuf2+endpos)-'0');
*(pbuf2+endpos) = (ret - (ret/10)*10)+'0';
ret = ret/10;
}
}
}
string ret(pbuf2);
ret.insert(ret.size()-dot[0]-dot[1], 1, '.');
delete[] pbuf2;
return ret;
}
int main()
{
string r;
int n=0;
while(cin>>r>>n)
{
string newret=r;
for(int i=0; i<n-1; i++)
newret = fun(newret,r);
while(newret[0]=='0')
newret.erase(newret.begin());
int pos = newret.find('.');
while((newret.size()>0) && (newret[newret.size()-1]=='0') && (pos>=0))
newret.erase(newret.begin()+newret.size()-1);
if(newret.size()>0 && newret[newret.size()-1]=='.')
newret.erase(newret.begin()+newret.size()-1);
if(n==0)
newret="1";
else if(newret=="")
newret="0";
cout<<newret<<endl;
}
return 0;
}
程序23:00就把主要算法写好了,一直Wrong Answer,但是搞到夜里1:40,网上百度测试用力,发现(1,0)=1,和(0,1)=0没通过,也反映了测试相当重要
测试用例:http://files.cnblogs.com/HCOONa/POJ1001TestCase.zip
感谢:http://www.cnblogs.com/HCOONa/archive/2010/07/10/1775005.html