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
",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
", i);
        }    
    }
    return 0;    
}
原文地址:https://www.cnblogs.com/Lee-geeker/p/3226524.html