回文数
- 0.题目
- 1.WJQ的思路
- 2.实现过程
- 2.0 原始值怎么一个个取出来?
- 2.1 取出来的数如何存到新的数字后面?
- 2.2完整的反转得到新数的过程
- 3.完整的代码
- 4.可运行的代码
- 5.算法还可以优化的部分
0.题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
1.WJQ的思路
思路可行,如何实现?
2.实现过程
2.0 原始值怎么一个个取出来?
取高位 x=x/10
除以10再取整
取低位 x=x%10
除以10再取余
原始值从最低位开始取,新的数从最高位开始存
2.1 取出来的数如何存到新的数字后面?
reversed = reversed * 10 + x % 10;
对于新的数字,我将原有的数字乘10加上取余得到的数
2.2完整的反转得到新数的过程
int original = x; // 存储原始值
long reversed = 0; // 反转后新的数
while (x != 0) {
reversed = reversed * 10 + x % 10;
x /= 10; //只是x=x/10的缩写形式,没什么高端的意思
}
3.完整的代码
bool isPalindrome(int x) {
int original = x; // 存储原始值
long reversed = 0; // 用长整型防止溢出
// 反转整数
while (x != 0) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
// 比较反转后的值与原始值
return original == reversed;
}
4.可运行的代码
#include <iostream>
bool isPalindrome(int x) {
// 负数不是回文数
if (x < 0) return false;
int original = x; // 存储原始值
long reversed = 0; // 用长整型防止溢出
// 反转整数
while (x != 0) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
// 比较反转后的值与原始值
return original == reversed;
}
int main() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
if (isPalindrome(number)) {
std::cout << number << " is a palindrome." << std::endl;
} else {
std::cout << number << " is not a palindrome." << std::endl;
}
return 0;
}
5.算法还可以优化的部分
- 负数能直接判断不是回文数
- 两边都只判断一半