USACO Section 1.2 Dual Palindromes 解题报告

题目

题目描述

有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是回文数。

编一个程序,从文件读入两个十进制数N、S。然后找出前 N 个满足大于 S 且在两种以上进制(二进制至十进制)上是回文数的十进制数。

数据范围

  1. 1 <= N <= 15
  2. 0 < S < 10000

样例输入

3 25

样例输出

26

27

28

解题思路

按照Palindromic Squares的解题思路,我们直接枚举所有的数字,然后判断是否满足条件,满足条件的输出即可。

解题代码

/*
ID: yinzong2
PROG: dualpal
LANG: C++11
*/
#define MARK
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm> using namespace std;
const int MAXN = 32; char alph[20] = {'0', '1', '2', '3', '4',
'5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J'
};
int n,s; char *trans(int x, int base) {
char *b = new char[MAXN];
int len = 0;
while(x) {
b[len++] = alph[x%base];
x /= base;
}
b[len] = '\0';
return b;
} bool judge(char s[]) {
int len = strlen(s);
for(int i = 0, j = len-1; i <= j; i++, j--) {
if(s[i] != s[j]) {
return false;
}
}
return true;
} int main() {
#ifdef MARK
freopen("dualpal.in", "r", stdin);
freopen("dualpal.out", "w", stdout);
#endif // MARK
while(~scanf("%d%d", &n, &s)) {
bool flag;
//用cnt来保证一共找到n个符合要求的回文串
for(int i = 1, cnt = 0; cnt < n; i++) {
flag = false;
//num用来记录一个数在2~10进制之间共有几种进制是回文串
int num = 0;
for(int j = 2; j <= 10; j++) {
if(judge( trans(s+i, j) )) {
num++;
if(num >= 2) {
flag = true;
cnt++;
break;
}
}
}
if(flag) {
printf("%d\n", s+i);
}
}
}
return 0;
}
上一篇:USACO Section 1.3 Mixing Milk 解题报告


下一篇:USACO Section 1.1 Broken Necklace 解题报告