2017年PAT乙级秋考D题宇宙无敌加法器 20分 知识点:高精度加法

285 阅读1分钟

题目:1074 宇宙无敌加法器 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:74_哔哩哔哩_bilibili

这道题是普通模拟加法的变种,我们还是进行加法模拟,但是多种进制的问题我们可以把各种进制存储到一个数组里根据情况选择就可以了:

#include<bits/stdc++.h>


using namespace std;
vector<int> D,A,B,ans;
int main()
{
	
	//进制字符串  需要特殊处理 
	string s;cin>>s;
	for(int i=s.size()-1;i>=0;i--)
	{
	//特殊处理部分: 
	             	//0代表10进制 
		if(s[i]!='0')D.push_back(s[i]-'0');	
	    else D.push_back(10); 
	}  
	
	cin>>s;
	for(int i=s.size()-1;i>=0;i--)
	{
	  A.push_back(s[i]-'0');	
	} 
	
	cin>>s;
	for(int i=s.size()-1;i>=0;i--)
	{
	  B.push_back(s[i]-'0');	
	}
	
	int t=0;
	for(int i=0;i<A.size()||i<B.size();i++)
	{
	
	  if(i<A.size())t+=A[i];
	  if(i<B.size())t+=B[i];
	  ans.push_back(t%D[i]);
	  t/=D[i]; 
	}	
	
	if(t)ans.push_back(1);
	
	//去掉末尾0(为了之后翻转做准备)
	while(ans.size()>1&&ans.back()==0)  //因为要去0,因此要保证长度至少要大于1,否则去完0之后就没东西了   
     ans.pop_back();
	
	for(int i=ans.size()-1;i>=0;i--)
	{
		cout<<ans[i];
	 } 
	
	return 0;
}