回文数的变换

£可爱£侵袭症+ 提交于 2020-03-03 01:28:21

题目:一个正整数,如果高低位交换和原数相等,那么称这个数为回文数。
问题:任意一个正整数,如果其不是回文数,将该数高低位以后和原数相加得到一个新的数,如果不是回文数,重复这个变换,直到得到一个回文数为止。
例如 :57变换后得到132(57+75),132得到363(132+231),363是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。

输入格式

输入一行一个正整数n。

输出格式

输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用“—>”连接。
保证最后的生成数在int范围类

样例输入
349

样例输出
3
349—>1292—>4213—>7337

代码如下:

#include<iostream>
using namespace std;
int arr[1005];
int shu[1005]; 
bool judge(int x)
{   
    int cnt = 0;
	while(x){
		shu[cnt++] = x % 10;
		x /= 10;
	}
	for(int c = 0; c < cnt / 2; c++){
		if(shu[c] != shu[cnt-1-c])
		return false;
	}
	return true;
}

int rev(int x)
{
	int ret = 0;
	while(x){
		ret=ret*10+x%10;
		x/=10;
	}
	return ret;
}

int main( )
{
	int n;
	cin>>n;
	int kaishi=n;
	int a = 0;
	while(!judge(n)){
		n+=rev(n);
		arr[a]=n;
		a++;
	}
	cout<<a<<endl;
	cout<<kaishi;
	for(int b = 0; b < a;b++){
		cout<<"--->"<<arr[b];
	}
	return 0;

`

  • 分析题目

首先是需要判定回文数,那么需要手写一个判定回文数的函数,但题目并不是判定一个数是不是回文数,而是求一个非回文数变换到回文数的过程。所以变换的过程也需要考虑。

  • 算法–判断回文数:
将一个数的每一位提取并存下来,然后将高位和低位比较即可
bool judge(int x)
{   
    int cnt = 0;
	while(x){
		shu[cnt++] = x % 10;
		x /= 10;
	}
	for(int c = 0; c < cnt / 2; c++){
		if(shu[c] != shu[cnt-1-c])
		return false;
	}
	return true;
}
  • 算法–变换回文数
    在这里插入图片描述
    定义一个数ret = 0。将要求的数x每一位取余然后加到ret中,每次ret都将原来的大小乘以10,那么当x为0时循环结束。返回ret即可。
int rev(int x)
{
	int ret = 0;
	while(x){
		ret=ret*10+x%10;
		x/=10;
	}
	return ret;
}
  • 输出格式
    按照题目要求在求回文数的过程中将回文数存入数组中,再输出原来的数n。然后在每个输出前加上“—>”。
while(!judge(n)){
		n+=rev(n);
		arr[a]=n;
		a++;
	}
	cout<<a<<endl;
	cout<<kaishi;
	for(int b = 0; b < a;b++){
		cout<<"--->"<<arr[b];
	}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!