C++程序 检查数字是否为回文数

C++程序 检查数字是否为回文数

给定一个整数,编写一个函数,如果给定数字是回文数,则返回true,否则返回false。例如,12321是回文数,但1451不是回文数。

C++程序 检查数字是否为回文数

假设给定数字为 num 。这个问题的一个简单方法是首先反转 num 的数字,然后将 num 的反转与 num 进行比较。如果两者相同,则返回true,否则返回false。

下面是一个灵感来自此帖子的方法#2的有趣方法。想法是创建一个 num 的副本并通过引用递归传递副本,并通过值传递 num 。在递归调用中,向下移动递归树时,将 num 除以10。在向上移动递归树时,将复制数除以10。当它们在所有子调用都结束的函数中相遇时, num 的最后一位将是从开头开始的第i位,复制的最后一位将是从末尾开始的第i位。

//一个检查给定数字是否回文的递归C++程序
#include <iostream>
using namespace std;
//一个函数只返回数字中包含一个数字时为真
int oneDigit(int num){
    //比较操作比除法操作快。
    //因此使用以下方式替换“return num
    return (num >= 0 && num < 10);
}
//递归函数,以找出num是否为回文
//dupNum最初包含num的副本的地址。
bool isPalUtil(int num, int* dupNum){
    //基本情况(需要递归终止):此语句主要将第一位与最后一位进行比较
    if (oneDigit(num))
        return (num == (*dupNum) % 10);
    //这是该方法中的关键行。请注意,所有递归调用都有一个num的单独副本,但它们都共享相同的*dupNum的副本。在向下移动递归树时,我们在除以num。当我们向上移动递归树时,除以复制的数字。在它们在所有子调用都完成的函数中相遇时,num%10将包含从开头开始的第i位,而(*dupNum)%10将包含从末尾开始的第i位。
    if (!isPalUtil(num / 10, dupNum))
        return false;
    //当我们向上移动递归调用树时,执行以下语句
    *dupNum /= 10;
    return (num % 10 == (*dupNum) % 10);
}
//使用递归函数isPalUtil()检查数字是否为回文数的主函数
int isPal(int num){
    //检查num是否为负数,使其为正数
    if (num < 0)
        num = -num;
    //创建num的单独副本,以便对地址dupNum的修改不会更改输入数字。
    int* dupNum = new int(num);
    return isPalUtil(num, dupNum);
}
//驱动程序
int main(){
    int n = 12321;
    isPal(n) ? cout << "Yes": 
               cout << "No" << endl;
    n = 12;
    isPal(n) ? cout << "Yes":
               cout << "No" << endl;
    n = 88;
    isPal(n) ? cout << "Yes":
               cout << "No" << endl;
    n = 8999;
    isPal(n) ? cout << "Yes":
               cout << "No";
    return 0;
}
// 该代码由shivanisinghss2110提供```  

输出:

Yes
No
Yes
No 

时间复杂度: O(log(n))

辅助空间: O(1)。

在不使用任何额外空间的情况下检查数字是否为回文数

方法2:使用string()方法

  1. 当数字的位数超过 18 时,我们无法将该数字视为整数,因为 long long int 的范围不满足给定的数字。
  2. 因此将输入作为字符串,从开头到长度的一半运行一个循环并检查字符串的第一个字符(数字)到字符串的最后一个字符,其次是倒数第二个字符,依此类推……如果任何字符不匹配,则该字符串不是回文字符串。

以下是上述方法的实现

// C++实现上述方法
#include <iostream>
using namespace std;
 
// 检查回文字符串的函数
int checkPalindrome(string str)
{
    // 计算字符串长度
    int len = str.length();
   
    // 遍历字符串至其一半长度
    for (int i = 0; i < len / 2; i++)
    {     
        // 比较从起始位置到第i个字符的字符与从字符串长度-len-i到倒数第i个字符的字符
        if (str[i] != str[len - i - 1])
            return false;
    }
   
    // 若上述循环不返回,则表示该字符串为回文字符串
    return true;
}
 
// 主函数
int main()
{
    // 将数字取为字符串
    string st =
    "112233445566778899000000998877665544332211";
    if (checkPalindrome(st) == true)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}
// 本代码是由vikkycirus编写的```  

输出:

Yes

时间复杂度: O(|str|)

空间复杂度: O(1),因为没有使用额外的空间。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例