题目大意:
给出两个整数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; } }