洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
题目描述
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于32位的整型
输入输出格式
输入格式:
只有一行,用空格隔开的两个数N和S。
输出格式:
N行, 每行一个满足上述要求的数,并按从小到大的顺序输出。
这题思路很简单,从s开始判断是不是双重回文数,是则计数,找到n个为止.
要注意的是s本身也要判断.
#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;
}