题目描述
从左到右读取数字从左到右读取相同的数字称为回文。 数字12321是回文; 数字77778不是。 当然,回文没有前导和尾随零,所以0220不是回文。
数字21(基数10)在基数10中不是回文,而数字21(基数10)实际上是基数2(10101)中的回文。
编写一个读取两个数字的程序(以10为基数):
N(1 <= N <= 15)
S(0 <S <10000)
然后在两个或多个数字基础(2 <= base <= 10)中查找和打印(在10)中严格大于S的前N个数字,它们是回文。
这个问题的解决方案不需要操纵大于标准32位的整数。
程序名称:dualpal
输入格式
单行空格分隔整数N和S.
输入(file dualpal.in)
3 25
输出格式
N行,每个都有至少两个基中表达的基数为10的回文。 这些数字应该按照从小到大的顺序列出。
输出(file dualpal.out)
26
27
28
解题思路
本题主要思路是,找出大于s的n个数使得这些数转化为2~10进制的字符串形式时有两种或两种以上为回文数。则我们必须把大于s的每个数转换为2~10进制的形式判断是否有两种或者两种以上为回文数,若是且是的个数不超过n则输出。
解题代码
/*
ID: 15189822
PROG: dualpal
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ofstream fout ("dualpal.out");
ifstream fin ("dualpal.in");
void zhuanhuan(char *a, int num, int base){
int k = 0, temp;
while(num){
temp = num % base;
if(temp<10) a[k++]=temp+'0';
else a[k++]='A'+temp-10;
num/=base;
}
a[k] = '\0';
}
bool panduan(char *a){
bool ans=true;
char t[100];
int l=strlen(a);
for(int i=0;i<l;i++) t[l-i-1]=a[i];
t[l]='\0';
if(strcmp(a,t)==0) return true;
else return false;
}
int main(){
int n, s, ok;
char a[100];
fin>>n>>s;
for(s++;n>0;s++){
ok = 0;
for(int i=2;i<=10;i++){
zhuanhuan(a,s,i);
if(panduan(a)) ok++;
if(ok>=2){
fout<<s<<endl;
n--;
break;
}
}
}
return 0;
}