P1207 [USACO1.2]双重回文数 Dual Palindromes

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ssl_TRX/article/details/84894216

题目描述

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。

事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。

编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。

本问题的解决方案不需要使用大于32位的整型

输入输出格式

输入格式:

只有一行,用空格隔开的两个数N和S。

输出格式:

N行, 每行一个满足上述要求的数,并按从小到大的顺序输出。

扫描二维码关注公众号,回复: 4600156 查看本文章

输入输出样例

输入样例#1: 复制

3 25

输出样例#1: 复制

26
27
28

说明

题目翻译来自NOCOW。

USACO Training Section 1.2

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
using namespace std;
int n,kk;
int m;
int a[10000];
inline void change(int x,int n)
 {
 	while(x!=0)
 	 {
 	 	a[++kk]=x%n;
		x/=n;
			  }
 }
 inline void clear(int n)
  {
  	for(int i=1;i<=n;i++)
  	 a[i]=0;
  }
  inline bool check(int x)
   {
   	int s=0;
   	for(int i=2;i<=10;i++)
   	 {
   	 	int m=0;
   	 	clear(kk);
   	 	kk=0;
   	 	change(x,i);
   	 	for(int j=1;j<=kk/2;j++)
   	 	 if(a[j]!=a[kk-j+1])m=1;
   	 	 
   	 	if(!m)s++;
		if(s==2)return 1;	 
		}
		return 0;
   }
int main()
 {
 	scanf("%d%d",&n,&m);
 	int k=m;
	 while(n>0)
 	 {
 	 	++k;
 	 	if(check(k))
 	 	 {
 	 	  printf("%d\n",k);
 	 	  n--;
 	     }
 	 	 
	  }
 }

猜你喜欢

转载自blog.csdn.net/ssl_TRX/article/details/84894216