PAT A1019 General Palindromic Number
Sample Input 1:
27 2
Sample Output 1:
Yes
1 1 0 1 1
Sample Input 2:
121 5
Sample Output 2:
No
4 4 1
word | meaning |
---|---|
Palindromic Number | 回文数 |
numeral system | 记数法或数制 |
standard notation | [统计] 标准记数法 |
- 思路1:
用一个数组a[],存储基数为b下每一位的值(不会超过109,故仍用int型) - code1:
#include <stdio.h>
using namespace std;
//const int maxn = 100000010; //!!!:Wrong 1:不需要开这么大,即使基最小为2,开到10也能表示出10^9了
const int maxn = 20;
int a[maxn];
int main(){
int n, b, idex = 0;
scanf("%d%d", &n, &b);
do{
a[idex++] = n % b;
n /= b;
}while(n != 0); //!!!:Wrong 2: 要使用do_while:n恰好等于0时,a[0]=0;
bool flag = true;
for(int i = 0; i < (idex+1)/2; ++i){
if(a[i] != a[idex-i-1]){
//!!!:Wrong 3:idex-1才是最后一位,不是idex
flag = false;
break;
}
}
if(flag == false) printf("No\n");
else printf("Yes\n");
for(int i = idex-1; 0 <= i; --i){
printf("%d", a[i]);
if(i != 0) printf(" ");
}
return 0;
}
-
TIPS 1:
int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff (0,1111…1111) -
Wrong:
第一次写的时候采用的是string存储,通过reverse函数判断是否回文,这样是不行的,因为n在b进制下每位可能>10,即不是一个单char -
T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
int ans[maxn];
int Change(int x, int b){
int idex = 0;
do{
ans[idex++] = x % b;
x /= b;
}while(x);
return idex;
}
bool Judge(int len){
for(int i = 0; i < len; ++i){
if(ans[i] != ans[len-1-i]) return false;
}
return true;
}
int main(){
int n, b;
scanf("%d %d", &n, &b);
int len = Change(n, b);
if(Judge(len)){
printf("Yes\n");
}else printf("No\n");
for(int i = len - 1; i >= 0; --i){
printf("%d", ans[i]);
if(i != 0) printf(" ");
}
return 0;
}