题目大意:

给出两个整数n、s。要求找出前n个比s大并符合条件“在二到十进制之间的表示形式中,至少在两种进制下为回文数”的整数。

思路:

简单模拟,思路见注释。

代码:

/*
ID: lujunda1
LANG: C++
PROG: dualpal
*/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
//将整数n转换为b进制并存入字符数组num[]中
void trans(char num[],int n,int b)
{
	for(int i=0;;i++)
	{
		num[i]=n%b>9?n%b-10+'A':num[i]=n%b+'0';
		n/=b;
		if(n==0)
		{
			num[i+1]='\0';
			break;
		}
	}
	for(int i=0;i<strlen(num)/2;i++)
		swap(num[i],num[strlen(num)-1-i]);
}
//判断n是否是回文数
bool func(int n,int b)
{
	char num[100];
	trans(num,n,b);
	for(int i=0;i<=strlen(num)/2;i++)
		if(num[i]!=num[strlen(num)-1-i])
			return false;
	return true;
}
int main()
{
	freopen("dualpal.in","r",stdin);
	freopen("dualpal.out","w",stdout);
	int n,s;
	scanf("%d%d",&n,&s);
	//total用于记录符合条件的整数的数量 
	for(int i=s+1,total=0;total<n;i++)
		//sum用于记录整数i在二到十进制下为回文数的情况的个数 
		for(int j=2,sum=0;j<=10;j++)
			//当sum==2时,整数i已经符合条件。在此时输出并跳出循环。 
			if(func(i,j)&&++sum==2)
			{
				total++;
				printf("%d\n",i);
				break;
			}
}