北大acm1001 Time Limit Exceed (TLE)

这是我做的第一道acm的题,我做了三天半,一直报错运行超时Time Limit Exceed (TLE),主要原因是我个别情况没考虑到,n可能会取0,R可能会取000.9,8.,0.8000和4.00000各种诡异的形式,这些我们都要考虑到。这是最难的地方。

#include<iostream>
#include<string>
#include<cstring>
#include<sstream>
#include<vector>
#include<fstream>
using namespace std;


typedef struct name
{
	string s;
	int point_num;
}name;

string Add(string a, string b)
{
	int la = a.size();
	int lb = b.size();
	int lm = (a.size() > b.size() ? a.size() + 1 : b.size() + 1);
	//cout << "lm:" << lm << endl;
	string s(lm, '0');
	//cout << "s: " << s << endl;
	for (int i = la - 1, j = lb - 1, k = lm - 1; i >= 0 || j >= 0; i--, j--, k--)
	{
		if (i >= 0 && j >= 0)
		{
			int temp = a[i] - '0' + b[j] - '0' + s[k] - '0';
			s[k] = temp % 10 + '0';
			s[k - 1] = s[k - 1] - '0' + temp / 10 + '0';
		}
		else if (i >= 0)
		{
			int temp = a[i] - '0' + s[k] - '0';
			s[k] = temp % 10 + '0';
			s[k - 1] = s[k - 1] - '0' + temp / 10 + '0';
		}
		else
		{
			int temp = b[j] - '0' + s[k] - '0';
			s[k] = temp % 10 + '0';
			s[k - 1] = s[k - 1] - '0' + temp / 10 + '0';
		}
		//cout << "s: " << s << endl;
	}
	
	if (s[0] == '0')
		s.erase(s.begin());
	return s;
}

string multiply(string a, string b)//两个整型大数相乘,b是比较小的
{
	int num = atoi(b.c_str());//把b转化为long型,b比较小,所以不会溢出
	int la = a.size();
	vector <string>s;
	int k = 0;
	for (int i = la - 1; i >= 0; i--)//类似于45678*123用45678*3,然后45678*2然后45678*1最后错位相加
	{
		int n=a[i] - '0';
		long temp=n*num;
		ostringstream oos;
		oos << temp;
		string c=oos.str();
		c.append(k, '0');
		s.push_back(c);
		k++;
	}
	string str;
	if (s.size() >= 2)
	{
		str = Add(s[0], s[1]);
		for (int i = 2; i <= s.size() - 1; i++)
			str = Add(str, s[i]);
	}
	else
		str = s[0];
	return str;
}

name zhengli(string a)//统计小数点后有几位小数
{
	int la;
	int point;
	la = a.size();
	int p = a.find('.');
	if (p != a.npos)//有小数点
	{
		int num = 0;
		for (int i = 0; i < la; i++)
			if (a[i] == '.' || a[i] == '0')
				num++;
		if (num == la)//对于00.00000的情况
		{
			a = '0';
			point = 0;
		}
		else
		{
			a.erase(a.begin() + p);//删除小数点
			point = a.size() - p;//小数点的位数
			for (int i = 0; i < a.size(); )//0.00089变为89
			{
				if (a[i] == '0')
					a.erase(a.begin());
				else
					break;
			}
			for (int j = a.size() - 1; j >= 0; j--)//0.67000->67,0.8700->87
			{
				if (a[j] == '0'&&point>0)//78.0变为78,8.变为8
				{
					a.erase(a.end() - 1);
					point--;
				}
				else
					break;
			}
		}
	}
	else//没有小数点
		{
			point = 0;
			for (int i = 0; i < a.size();)//0067->67,00087->87,97876->97876
			{
				if (a[i] == '0')
					a.erase(a.begin());
				else
					break;
			}
		}
	
	name result;//没有办法直接返回两个返回值,所以采用结构体形式
	result.s = a;
	result.point_num = point;
	return result;
}
	
int main()
{
	string a;
	int n ;
	//ifstream fin("C:\\Users\\ZSM\\Desktop\\now\\input.txt");
	while(cin >> a >> n)
	{
		name re = zhengli(a);
		//cout << re.s << endl << re.point_num << endl;
		string str = re.s;
		if (n == 0 && atoi(str.c_str()) == 0)//讨论n为0的几种情况,注意这里0的0次幂为1。
			str = "1";
		else if (n == 0 && atoi(str.c_str()) != 0)
			str = "1";
		else if (n != 0 && atoi(str.c_str()) == 0)
			str = "0";
		else
		{
			int m = n - 1;
			while (m--)
			{
				str = multiply(str, re.s);
			}
		}
		int len = re.point_num*n;
		if (str.size() >len && len!=0)
			str.insert(str.end() -len, '.');
		else if(str.size() <= len)
		{
			int c = len - str.size();
			while (c--)
				str.insert(str.begin(), '0');
			str.insert(str.begin(), '.');
		}
		cout << str<<endl;
	}
	system("pause");
	return 0;

}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值