题目链接
题目
给定一个十进制数和基数,判断对应进制数是否回文数,并打印
1 0是回文数
2 题目中没有标明大于10的进制中字母如何处理,试错发现,并不能将两位数字转化为字母,而是使用两位数字,并且在判断回文和打印时,这个两位数字都看做一个整体
解题思路
因为要用两位数字表示基数大于10的进制中大于10的数字,并将这种两位数看做一个整体处理,所以必须使用整型数组,不可使用字符串拼接
1 进制转换
2 判断回文
易错点
该题目必须使用整型数组,不能使用字符串,因为16进制中不适用字母,而是使用x%p后的两位数字,并且这个两位数字在判断回文和打印时,都是两位为一个整体打印的
Code
Code 01
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
/*
判断任意进制的数是否是回文数
注:该题目必须使用整型数组,不能使用字符串,因为16进制中不适用字母,而是使用x%p后的两位数字,
并且这个两位数字在判断回文和打印时,都是两位为一个整体打印的
*/
int ans[100],num;
// 1 判断是否回文
bool isP() {
for(int i=0; i<num; i++) {
if(i>=num-1-i)break;
if(ans[i]!=ans[num-1-i]) {
return false;
}
}
return true;
}
// 2 十进制转换为任意进制
void pt(int x, int p) {
int temp;
do {
temp = x%p;
x/=p;
ans[num++]=temp;
} while(x!=0);
}
int main() {
//1 输入
int n,p;
scanf("%d%d",&n,&p);
pt(n,p);
printf("%s
",isP()?"Yes":"No");
for(int i=num-1; i>=0; i--) {
printf("%d",ans[i]);
if(i!=0) printf(" ");
}
return 0;
}
Code 02
#include <iostream>
#include <string>
using namespace std;
/*
请查看错误版本比对,错误在:a%b后可能>9,但并不转换为字母,而是用模的结果两位数字表示
解决办法:
1 将每次取模后的数字保存在int数组中
*/
int main(int argc, char *argv[]) {
int a,b;
cin>>a>>b;
int arr[40], index = 0;
while(a != 0) {
arr[index++] = a % b;
a = a / b;
}
int p=0,q=index-1;
while(p<q) {
if(arr[p]!=arr[q])break;
else {
p++;
q--;
}
}
if(p<q)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
for(int i=index-1; i>=0; i--) {
cout<<arr[i];
if(i!=0)cout<<" ";
}
return 0;
}