回文数 | ||||||
| ||||||
Description | ||||||
一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,1234321就是一个回文数,而778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。 事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。 编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。 本问题的解决方案不需要使用大于32位的整型 | ||||||
Input | ||||||
每行输入两个整数N,S 处理到文件结束 | ||||||
Output | ||||||
第一行输出Case k: k代表第k组测试数据,从1开始递增 接下来N行, 每行一个满足上述要求的数,并按从小到大的顺序输出. | ||||||
Sample Input | ||||||
3 25 | ||||||
Sample Output | ||||||
Case 1: 26 27 28 | ||||||
Source | ||||||
2012 Winter Holiday Contest 5 - Water Battle II | ||||||
Author | ||||||
万祥 |
AC代码(暴力枚举):
#include <cstdio>
#include <cstring>
#include <algorithm>
int n,s,i,j,k = 1;
bool check(int x, int jinzhi) //判断是否为回文数
{
int a[10005],i = 0;
while (x)
{
a[++i] = x % jinzhi;
x /= jinzhi;
}
int t = i;
while (i && a[i] == a[t - i + 1])
i--;
if (i == 0)
return true;
return false;
}
int main()
{
while(~scanf("%d%d", &n, &s))
{
int num = 0;
printf("Case %d:\n",k);
for ( i = s + 1; num < n; i++) //直接从s+1枚举,直到有N个为止
{
int temp = 0;
for ( j = 2; j <= 10; j++)
{
if (check(i, j))
temp++;
if (temp == 2)
break;
}
if (temp == 2)
{
printf("%d\n", i);
num++;
}
if(num == n)
k++;
}
}
}
其他判断回文数办法(数学方法):
#include<stdio.h>
int main()
{
int x,newed,t,n;
while(scanf("%d",&x) != EOF)
{
newed = 0;
n = x;
do
{
newed = newed * 10 + x % 10;
x /= 10;
}while(x > 0);
if(n == newed)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}