这是本次课程的第一次博客,所以就选了一个比较简单的回文数来试一下水
判断回文数
题目非常简单明了就不多说了
按一般的想法,解决回文数问题是要用到字符串的,但是碰巧看到题目里有进阶说能不能不用字符串来解决,细细一想好像还真的很简单
为了判断回文数,我们只需要判断一个整数某些数位上的数字是否相等即可
比如说对于一个长度为length
的整数,那么只需要用一个循环遍历length/2
个长度
然后依次判断各个数位的数是否相等
受益于C++除法的向下取整,我们也不用分奇数偶数来算
当遍历到第i
个数字时,查找对应的length - i + 1
位置的数字是否与i位置的相同即可
在这题中你甚至不用考虑前后顺序,因为回文数都是对称的了
关键代码如下
这是这道题的主要思路
现在具体只需要实现一个取某个整数任意数位上数值的函数即可
这个就比较简单了,用上double即可
要查找第i
个数字就除以10^i
让目标数位的右边正好是小数点,然后除10取余即可
方便快捷搞定,关键部分代码:
以下附上完整代码:
#include<math.h>
class Solution {
public:
int getnumber(int x, int pos){
//转化成double类型
double x1 = x;
//取小数点前一位
int rest = (int)(x1 / pow(10, pos - 1)) % 10;
return rest;
}
bool isPalindrome(int x) {
if(x >= 0){
if(x < 10){
return true;
}
//自增
int i = 0;
//获取数据的长度
int length = 0;
//10的N次方比目标数大时跳出
while(1){
if(x < pow(10, i))
break;
length++;
i++;
}
cout<<length<<"\n";
for(int i = 1; i <= length / 2; i++){
//对应的数字相等
if(getnumber(x, i) == getnumber(x, length - i + 1)){
//没遍历完,继续
if(i != length/2) continue;
//遍历完了
else if(i == length/2) return true;
}
else{
return false;
}
}
}
return false;
}
};