给你一个长度为 n 的数字串,找出其中位数不超过15位的不包含前导0和后导0的数 x ,使得 x+f(x) 是一个回文数,其中 f(x) 表示将 x 反转过来的数。
输入格式
多组输入,处理到文件结束,样例保证不超过1000组。
每组第一行一个整数 n ,表示数字串的长度(1≤n≤1000),
接下来一行输入一个长度为 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; }