poj1001 Wrong Answer

8 篇文章 0 订阅
#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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值