描述
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于32位的整型
格式
PROGRAM NAME: dualpal
INPUT FORMAT:
(file dualpal.in)
只有一行,用空格隔开的两个数N和S。
OUTPUT FORMAT:
(file dualpal.out)
N行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
SAMPLE INPUT
3 25SAMPLE OUTPUT
26 27 28
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
using namespace std;
int hw(int s)
{
int ans=0;
for(int i=2;i<=10;i++)
{
if(ans==2) break;
int s0=s,j=0;
long long x=0;//转换成二进制可能很长
while(s0)
{
x+=(s0%i)*pow(10,j);
s0/=i;
j++;
}
//cout<<x<<endl;
stringstream t;
string s;
t<<x;
t>>s;
int ls=s.size(),l=0;
while(s[l]==s[ls-1-l] && l<=(ls-1)/2)
{
l++;
}
l--;
if(l==(ls-1)/2) ans++;
}
return ans;
}
int main(){
int n,s,num=0;
cin>>n>>s;
while(num<n)
{
s++;
if(hw(s)==2)
{
cout<<s<<endl;
num++;
}
}
return 0;
}