1107: 回文数猜想(函数专题)

题目描述

一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如: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 
using namespace std;
#include 
#include
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;
}

你可能感兴趣的:(c++,c++,蓝桥杯,算法)