ACM 回文数

一个正整数,如果从左向右读和从右向左读是一样的,这样的数就叫回文数。
任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。
小明在某次考试中突然想到一个问题:是不是不论由什么正整数开始,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。
小明是那么执着于他的猜想,以致于没有做完试卷(惨案现场)。 现在,小明决定化悲痛为力量,并将这个猜想命名为小明猜想。
他悄悄地塞给了你几个数,你能帮他计算吗。

Input

每行一个正整数。 
特别说明:输入的数据保证中间结果小于2^31。

Output

对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。
保证题中的每个数经过变换后都能变成回文数

Sample Input

27228
37649

Sample Output

3
27228--->109500--->115401--->219912
2
37649--->132322--->355553
#include<iostream>
using namespace std;
int huiwen(long num,long *y)
{
	long s=num;
	*y=0;
	while(s>0)
	{
		(*y)=(*y)*10+s%10;
		s=s/10;
		//	printf("%d ",*y);
	}
	if((*y)==num)//回文数 
	return 1;
	else
	return 0;
}
int main()
{
  long a[102]={0};//数组清零 
  int ct;
  long num;
  long y;
  
  while(cin>>num)
  {
  	y=0;
  	ct=0;
  	a[ct++]=num;
    while(1)//不是回文数 
  	{
  	  if(!huiwen(num,&y))//y为num的倒叙 
		{
	  	num=y+num;
	  	a[ct++]=num;
	  	//y=0;
	  	}
	  else {
	  a[ct++]=num;
	  break;
	}
	}
  	cout<<ct-2<<endl;
  	int i;
	  for(i=0;i<(ct-1);i++)
  	{
  		if(i!=(ct-2))
  		cout<<a[i]<<"--->"; 
  		else
  		cout<<a[i]<<endl;
	}
}
return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_42143003/article/details/86766564
ACM