2017-6-2
题目大意:
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
样例输入:
3 25
样例输出:
26
27
28
题解:
还是进制转换和回文数,遍历一遍就好,参考上篇题解。
代码:
C++
/*
ID: mujinui1
PROG: dualpal
LANG: C++
*/
#include<fstream>
#include<cstring>
using namespace std;
char num[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
int a[10000],c[1000];
int n,s;
int fun(int k,int b){
int i,t=1;
for(i=0;k!=0;i++){
c[i]=k%b;
k=k/b;
}
for(int j=0;j<i;j++){
a[j]=c[i-1-j];
}
for(int j=0;j<i;j++){
if(a[j]!=c[j]){
t=0;break;
}
}
return t;
}
int main(){
ifstream fin("dualpal.in");
ofstream fout("dualpal.out");
fin>>n>>s;
int flag=0;
for(int i=s+1;flag<n;i++){
int num=0;
for(int j=2;j<=10;j++){
if(fun(i,j)==1){
num++;
}
}
if(num>=2){
fout<<i<<endl;
flag++;
}
}
return 0;
}