题解【洛谷】P1015 回文数

题目描述:

点击进入题目
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。例如:给定一个

十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 121121 是一个回文数。

题意理解:

这是一道很明显的高精度加法的模拟题,如果这个数是回文数,那就输出到这个回文数的步数,输出格

式要注意一下,如果不是就把这个数和这个数反过来加起来。

思路分解:

  1. 先把高精度加法板子打起来

  2. 把输入进来的数放进一个vector里面

  3. 打一个判断回文数的程序

  4. 循环判断是否为回文数,输出格式要注意

  5. 如果30步以上还不是回文数,那么输出Impossible!

代码:


#include 
using namespace std;
int n;

bool check(vector<int> &a)
{
	vector<int> b=a;
	reverse(b.begin(),b.end());
	for(int i=0; i<a.size(); i++)
	{
		if(a[i]!=b[i])//判断数字是否相同即可
			return false;
	}
	
	return true;
}

vector<int> add(vector<int> &a,vector<int> &b)
{
	vector<int> c;
	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];
		
		c.push_back(t%n);
		t/=n;
	}
	
	if(t)
		c.push_back(t);
	
	return c;
}

int main()
{
	string M;
	vector<int> m;
	cin>>n>>M;
	
	if(n<=10)
	{
		for(int i=M.size()-1; i>=0; i--)
			m.push_back(M[i]-'0');
	}
	else
	{
		for(int i=M.size()-1; i>=0; i--)
		{
			if(isdigit(M[i]))
				m.push_back(M[i]-'0');
			else
				m.push_back(M[i]-'A'+10);//统一转换到十进制做加法
		}
	}
	
	for(int i=0; i<=30; i++)
	{
		if(check(m))
		{
			cout<<"STEP="<<i;
			return 0;
		}
		else
		{
			vector<int> c=m;
			reverse(c.begin(),c.end());
			m=add(m,c);
		}
	}
	
	cout<<"Impossible!";
	return 0;
}

注意事项

  1. 高精度加法里进位要取余进制,除以进制

你可能感兴趣的:(NOIP,#,算法,-,高精度,算法)