回文数判断 C++ (位数存取、元素逆置、转字符串)

题目描述

回文数:所谓回文数就是具有如下性质的整数:一个整数,当它的各位数字逆序排列,形成的整数与原整数相同,这样的数称为回文数。例如:22,878,其各位数字交换位置后仍然是22,878因此称为回文数。编写函数int loop(int x),判断一个整数是否为回文数,如果x是回文数则返回1,否则返回0。编写程序loop.cpp。接受控制台输入的两个整数a,b。调用loop函数输出a到b之间的所有回文数。

输入用例:3  120

输出用例:

3

4

5

6

7

8

9

11

22

33

44

55

66

77

88

99

101

111

解题思路:

       思考该题,首先要求编写函数int loop(int x),判断x是否为回文数,有很多思路,第一种即判x的首位和末位是否相等,再判断次位和倒数第二位是否相等,依次进行...关键在于,x的位数是未知的,因此我们需要定义一个整形数组,把求出x的每一位的值,存到该数组,然后再进行判断操作。

        第二种思路,就是元素逆置,直接把元素颠倒,再来判断是否相等。

        第三种思路就是在第一种的基础上,直接用string类型转换,不再去定义数组。因为C++提供了下标操作符来进入字符串中的某一确定位置的字符,即直接访问字符串中的每一个字符。接下来我们看具体代码:

方法一:

#include <iostream>
using namespace std;
int loop(int x)
{
    int a[100],n=0;//定义存取每一个位数的数组a和数组大小n
    //用while循环获取x的每一个位数
    while(x)
    {
        a[n]=x%10;
        x/=10;
        n++;
    }
    bool s=true;            //定义bool型判断是否为回文数
    int start=0,end=n-1;   //定义数组的首元素和尾元素下标便于下一步判断
    while(start<=end)
    {
        if(a[start]==a[end])
            {
                start++;
                end--;
            }
        else
            {
                s=false;
                break;
            }
    }
    if(s) return 1;
    else return 0;
}
int main()
{
    int a,b;  //定义起始位置和结束位置
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        if(loop(i)==1)
            cout<<i<<endl;
    }
    return 0;
}

输出结果:

618bce42a13548a192f03bd109bea33b.png

方法二:

#include <iostream>
using namespace std;
int loop(int x)
{
    int a[100],b[100];  //定义两个数组,一个逆置前,一个逆置后
    int n=0;           //数组长度
    while(x)
    {
        a[n]=x%10;
        x/=10;
        n++;
    }
    int j=n-1;
    for(int i=0;i<n;i++) //for循环遍历数组b逆序
    {

        b[j]=a[i];
        j--;
    }
    /*
    while方法
    int start=0,end=n-1;
    int temp=0;
    while(start<end)
    {
        temp=a[start];
        a[start]=a[end];
        a[end]=temp;
        start++;
        end--;
    }
    */
    bool s=true;
    for(int i=0;i<n;i++)
    {
        if(a[i]!=b[i])
        {
            s=false;
            break;
        }
    }
    if(s) return 1;
    else return 0;

}
int main()
{

int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
    if(loop(i)==1)
    cout<<i<<endl;
}

}

方法三:(用string方法转换,省去定义数组和求位数的步骤)

#include <iostream>
#include <string>       //一定要加上此头文件
using namespace std;
int loop(int x)
{
    int p=x;
    string s=to_string(p);   //int转string:    to_string()
    int start=0;
    int end=s.length()-1;
    bool isloop=true;
    while(start<=end)
    {
        //如果第一项和最后一项相等,则继续遍历,判断第二个和倒数第二个数...以此类推。如果不相等,则转向else条件
        if(s[start]==s[end])
        {
            start++;
            end--;
        }
        //判断不相等,跳出循环
        else {
            isloop=false;
            break;
        }
    }
    if(isloop)return 1;
    else return 0;


}
int main()
{

int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
   if(loop(i)==1)
        cout<<i<<endl;
}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值