题目描述
一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之。你已经会写求一个整数的逆序数的函数inverse(),那么如下循环可以模拟回文数猜想的验证过程:
while( m = inverse(n), m != n)
{
输出n;
把n更新为 m + n;
}
输入
输入一个正整数。特别说明:输入的数据保证中间结果小于2^31。
输出
输出占一行,变换的过程中得到的数值,两个数之间用空格隔开。
样例输入 Copy
27228
样例输出 Copy
27228 109500 115401 219912
#include <iostream>
using namespace std;
#include <iomanip>
#include<math.h>
int Dxs(int n); //计算倒序数函数
int Pow(int m1,int m2); //pow函数的传入参数用的是double类型
//但此题输入的数据整形比较方便,所以自己写了一个传入参数为整形的pow函数,
//功能与pow函数一致
int main()
{
int a1;
cin >> a1;
int a2;
a2=Dxs(a1); //计算输入数字的倒序数
int sum=a1;
cout << a1 <<" ";
while (a2!=a1&&a2!=sum) //这里使用&&在第一次就传入回文数或者之后的和有回文数的时候,
//都可以跳出循环
{
sum=sum+a2;
cout << sum <<" "; //每次数字后面加一个空格(题目要求)
a2=Dxs(sum); //计算自身与倒序数之和的倒序数
}
return 0;
}
int Dxs(int n)
{
int n1=n;
int n2=n;
int a[10];
int s=0;
int num;
int i=0;
for(num=-1;n1>0;)//此循环用于计算所传入参数的位数-1
{
n1/=10;
num++;
}
for (;n2>0;i++)//此函数用于计算倒序数
{
a[i]=n2%10;
s=s+a[i]*Pow(num,i);
n2/=10;
}
return s;
}
int Pow(int m1,int m2)
{
int s1=1;
for(int i=1;i<=m1-m2;i++)
{
s1*=10;
}
return s1;
}