题目描述
英文
中文大意
老生常谈,回文串。
输入N
和 b
,N
在b
进制下是否是回文数?
如果是,则输出Yes
,否则输出No
并在下一行(无论它是不是)都输出 N
在 b
进制下的数
样例
思路分析
首先把N
转换为b
进制,然后传入判断是否是回文串
判断是否回文串使用 双指针
需要注意的点:
N
的范围是 0<N<109 没有超出int
的表示范围,所以没有必要使用long
类型来表示
所以数组的范围以2
进制来计算,也只需30
位即可表示全部
-2147483648~2147483647[-231 ~ 231-1]
109:最高为10位数字
code
#include <iostream>
using namespace std;
// 把N转换为b进制, 并存入nums数组,cnt负责计数
void to_b_hex(int N, int b, int* nums, int &cnt) {
// 特情
if (N == 0) {
nums[cnt++] = 0;
return;
}
// 27 2 4 2
// 11011 N = 0 return 001
while (N) {
nums[cnt++] = N % b;
N /= b;
}
}
// 判断是否是回文数 cnt是nums中有效数字的个数
bool is_palindromic(int nums[], int cnt) {
for (int i = 0, j = cnt-1;i < j;i++, j--) {
if (nums[i] != nums[j])
return false;
}
return true;
}
int nums[30];
int main() {
int N, b, cnt = 0;
scanf("%d %d", &N, &b);
to_b_hex(N, b, nums, cnt);
if (is_palindromic(nums, cnt)) {
printf("Yes\n");
} else {
printf("No\n");
};
for (int i = cnt-1;i > 0;i--) {
printf("%d ", nums[i]);
}
printf("%d", nums[0]);
}