//译题
//★Dual Palindromes 双重回文数
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321 就是一
个回文数,而77778 就不是.当然,回文数的首和尾都应是非零的,因此0220 就不是回文数.
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是
回文数.
11
编一个程序,从文件读入两个十进制数
N (1 <= N <= 15) S (0 < S < 10000)
然后找出前N 个满足大于S 且在两种以上进制(二进制至十进制)上是回文数的十进制数,输出到
文件上.
本问题的解决方案不需要使用大于4 字节的整型变量.
PROGRAM NAME: dualpal
INPUT FORMAT
只有一行,用空格隔开的两个数N 和S.
SAMPLE INPUT (file dualpal.in)
3 25
OUTPUT FORMAT
N 行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
SAMPLE OUTPUT (file dualpal.out)
26
27
28
//参考代码
/*
这道题目和上一道题目差不多,依据题目的意思,
需要判断一个数是否是双重回文数,
这里注意的还是 进制的转换
回文数的判断,
其他没什么了
(注意要输出的是前N个大于S,并非大于等于S)
(题目提示4字节的整型变量足够解决问题)
*/
#include<stdio.h>
int num[15], x[15], l;
void Change( int n,int B)
{
int m = n, i, j;
l = -1;
while(m) {x[++l] = m%B; m /= B;}
for(i=l,j=0;i>=0;j++,i--)
num[j] = x[i];
}
int OK()
{
int i,j;
for(i=0,j=l;i<=j;i++,j--)
if(num[i]!=num[j]) return 0;
return 1;
}
int main()
{
int i, j, k, flag, N, S;
freopen("dualpal.in","r",stdin);
freopen("dualpal.out","w",stdout);
scanf("%d %d",&N,&S);
for(i=S+1,k=0;k<N;i++)
{
for(j=2,flag=0;j<=10;j++)
{
Change(i,j);
if(OK()) flag++;
if(flag>=2) break;
}
if(flag>=2)
{
printf("%d\n",i);
k++;
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
int N, S, i, sum;
int judge( int num )
{
int i,j,p,k,n,sum=0,a[100]={},l; // k为进制 ,p来判断是否是回文数
for(k=2;k<=10;++k)
{
n=num; l=0; p=1;
while(n) a[++l]=n%k, n/=k;
for(i=1,j=l;i<=j && p;++i,--j)
if(a[i]!=a[j]) p=0;
if(p) ++sum;
if(sum>=2) return 1;
}
return 0;
}
int main()
{
freopen("dualpal.in","r",stdin);
freopen("dualpal.out","w",stdout);
scanf("%d %d",&N, &S);
for(i=S+1;sum<N;++i)
{
if(judge(i))
{
++sum;
printf("%d\n", i);
}
}
return 0;
}