E. 数字串

给你一个长度为 n 的数字串,找出其中位数不超过15位的不包含前导0和后导0的数 x ,使得 x+f(x) 是一个回文数,其中 f(x) 表示将 x 反转过来的数。

输入格式

多组输入,处理到文件结束,样例保证不超过1000组。
每组第一行一个整数 n ,表示数字串的长度(1n1000)
接下来一行输入一个长度为 n 的数字串。

输出格式

第一行一个数 m 表示数字串中符合条件的数的个数(数可以重复)。
第二行从小到大输出 m 个数,每个数字之间以空格隔开。

样例

input
3
123
output
6
1 2 3 12 23 123

提示

1+1=2,
2+2=4,
3+3=6,
12+21=33,
23+32=55,
123+321=444

直接暴力查找

#include<iostream>
#include<cstdio> 
#include<vector>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
char s[1000+10];
vector<ll > ve;
ll fan(ll x){//反转数字 
    ll res=0;
    while(x){
        ll y=x%10;
        x=x/10;
        res=res*10+y;
    }
    return res;
}
int main(){
    ll t;
    while(scanf("%lld",&t)!=EOF){ 
        scanf("%s",s); 
        ll sum=0;
        for(int i=0;i<t;i++){//直接暴力每个字符 
            if(s[i]=='0') continue ;
            ll x=0;
            for(int j=0; j<15 && i+j< t;j++){//j表示的是长度,i+j表示的是当前的位置
                x= x *10+s[i+j]-'0' ; 
                if(s[i+j]=='0') continue ; //这个判断条件必须放在x转换方程的后面
                //对于那些中间为0的字符还是要考虑的 
                if(x+fan(x)==fan(x+fan(x))){
                    //就是判断这两个数的和是不是回文数,
                    //如果是的话,反过来应该相等 
                    ve.push_back(x);
                }
            }
        }
        sort(ve.begin(),ve.end()); 
        ll x=ve.size();
        printf("%lld\n",x); 
        for(int i=0;i<x;i++)
            printf("%lld ",ve[i]);
        cout<<endl;
        ve.clear();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/11370737.html