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] = '';
    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
", s+i);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yinzm/p/5818102.html