PAT A1019 General Palindromic Number (20) [回⽂数 进制转换]

题目链接

题目链接

题目

给定一个十进制数和基数,判断对应进制数是否回文数,并打印
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;
}
原文地址:https://www.cnblogs.com/houzm/p/13335049.html