回文回文数 HUST

来源:互联网 发布:linux 解压缩文件 编辑:程序博客网 时间:2024/04/30 21:25

回文回文数 HUST - 1694


Problem

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做 “回文数”。事实上,有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是回文数。现在,你需要找出来,前 N 个满足大于 S 且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数。

Input

有多组数据第一行是数据组数 T(T ≤10) 对于每组数据,包含两个数

N(N≤15),S(0

Output

对于每一个输入,先输出一个”Case #x:”,之后输出 N 行,每行一个回文回文数数字。

Sample Input

1
3 25

Sample Output

Case #1:
26
27
28

ps:初始化数组也是需要很长时间的

代码如下:

#include<iostream>  #include<cstdio>  #include<string.h>#include<algorithm> using namespace std; int a[100];int chark(int x, int index) {    int l = 0;    while( x ) {                a[l] = x % index;        x /= index;        l++;    } //  for(int i = 0; i < l; i++)//      printf("%d ", a[i]);//  printf("\n");    int flag = 1;    int i, j;    for(i = 0,j = l-1; i < j; i++, j--) {        if(a[i] != a[j]) {            flag = 0;            break;        }    }    if(flag) return 1;    else return 0;}int main () {    int t;    int k = 1;    scanf("%d", &t);    while( t-- ) {        int n , s;        scanf("%d %d", &n, &s);        int num = 1;        printf("Case #%d:\n", k++);         for(int x = s+1; num <= n; x++) {            int sum = 0;             for(int index = 2; index <=10 ; index++) {                sum += chark(x, index);//              printf("x == %d\nindex == %d\n", x, index);                if(sum >= 2) break;            }            if(sum >= 2) {                printf("%d\n", x);                num++;            }        }    }    return 0;}