老师留了个高精-,ACP2142的代码AC不了很疑惑,求解QAQ
  • 板块题目总版
  • 楼主SIXIANG32
  • 当前回复33
  • 已保存回复33
  • 发布时间2020/5/16 21:16
  • 上次更新2023/11/7 02:19:21
查看原帖
老师留了个高精-,ACP2142的代码AC不了很疑惑,求解QAQ
298549
SIXIANG32楼主2020/5/16 21:16

RT。
这是老师留下的作业,网址https://www.luogu.com.cn/problem/T133598

我的代码:

#include<iostream>
#include<string>//STL重度依赖症 
#include<algorithm>//reverse
using namespace std;
class bignum{
	public:
	string add(string s1,string s2)
	{
		string ans="";//答案 
		if(s1.size()<s2.size())
			for(int p=s1.size()-1;p<=s2.size()-2;p++)s1="0"+s1;
		if(s1.size()>s2.size())
			for(int p=s2.size()-1;p<=s1.size()-2;p++)s2="0"+s2;
		reverse(s1.begin(),s1.end());//简结的反转 
		reverse(s2.begin(),s2.end());//简洁的反转
		int a=0,b=0,c=0,s;
		for(int p=0;p<=s1.size()-1;p++)
		{
			a=s1[p]-'0',b=s2[p]-'0',s=a+b+c;
			if(s>=10)c=1,s%=10;
			else c=0;
			ans=char(s+'0')+ans;	
		} 
		if(c==1)
		ans=char(c+'0')+ans;
		return ans;
	}
	string sub(string s1,string s2)
	{
		string temp=cmp(s1,s2),ans="",answer="";//temp是大的家伙,ans是答案 
		bool flag=0;//负数标记 
		int id;
		if(temp==s2&&s1!=s2)swap(s1,s2),flag=1;//被减数>减数 
		if(s1==s2)return "0";
		//下面是+0 
		if(s1.size()<s2.size())
			for(int p=s1.size()-1;p<=s2.size()-2;p++)s1="0"+s1;
		if(s1.size()>s2.size())
			for(int p=s2.size()-1;p<=s1.size()-2;p++)s2="0"+s2;
		//下面是简洁的反转 
		reverse(s1.begin(),s1.end());
		reverse(s2.begin(),s2.end());
		//下面是核心 
		int a,b;//a是被减数数位,b是减数数位。 
		//cout<<s1<<' '<<s2<<endl;
		for(int p=0;p<=s1.size()-1;p++)//枚举每个被减数数位
		{
			a=s1[p]-'0';
			b=s2[p]-'0';
			if(a<b)a+=10,s1[p+1]--;
			ans=char(a-b+'0')+ans;
		} 
		for(id=0;id<=ans.size()-1;id++)
		if(ans[id]!='0')break;
		ans.erase(0,id);
		if(flag)ans="-"+ans;
		return ans;
	}
	private:
		string cmp(string s1,string s2)
		{
			if(s1.size()>s2.size())return s1;
			else 
			{
				if(s1.size()<s2.size())return s2;
				else if(s1==s2)return s1;
				else for(int p=0;p<=s1.size()-1;p++)
				{
					if(s1[p]>s2[p]){return s1;}
					if(s1[p]<s2[p]){return s2;}
				}
			}
		} 
};

int main()
{
	string s1,s2;
	cin>>s1>>s2;
	bignum BIG;//看,多简洁明了
	cout<<BIG.sub(s1,s2)<<endl; 
}

居然有个TLE了,第一个点是WA。但是这个代码可以ACP2142,本菜鸟很疑惑,毕竟我的时间复杂度可以过,求助。

2020/5/16 21:16
加载中...