C++程序 检查数字是否为回文数
给定一个整数,编写一个函数,如果给定数字是回文数,则返回true,否则返回false。例如,12321是回文数,但1451不是回文数。
假设给定数字为 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()方法
- 当数字的位数超过 18 时,我们无法将该数字视为整数,因为 long long int 的范围不满足给定的数字。
- 因此将输入作为字符串,从开头到长度的一半运行一个循环并检查字符串的第一个字符(数字)到字符串的最后一个字符,其次是倒数第二个字符,依此类推……如果任何字符不匹配,则该字符串不是回文字符串。
以下是上述方法的实现
// 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),因为没有使用额外的空间。