双重回文数

洛谷 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;
}

猜你喜欢

转载自blog.csdn.net/Mintind/article/details/81741254