USACO 1.2.5 Dual Palindromes
//译题 //★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; }