乐乐的回文(num)
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
乐乐最近喜欢研究回文数,假设一个数从左到右读跟从右到左读的结果是一样的,那么我们说这个数是一个回文数。 如果一个数在十进制下是回文的,我们说这个数是一重回文数,如果一个数在十进制和二进制下是回文的,我们说这个数是二重回文数,如果一个数在三种进制下是回文的,我们说这个数是三重回文数……。现在我们用数字0…9,字母‘A’…‘Z’分别代表数字0…35(即10用A表示,11用B表示……,35用Z表示),任意给出一个10进制数,乐乐想知道它在2至36进制里是多少重的回文数。
输入
只有一个10进制的整数n(2<=n<=2000000000);
输出
第一行为一个整数m,表示n在2至36进制里有m种是回文的; 接下来是m行,从小到大输出n在哪些进制下是回文的。
样例输入
50
输出
3 7 9 24
提示
50对应的7进制数为101,9进制数为55,24进制数为22。
【思路】
首先我们需要先输入N,然后再2~36循环,接着转进制然后判断回文,再按照题目要求输出即可。这道题我非常的后悔,我在考试时就因为手滑把36达成了24,然后就没了五十分…
【代码】
#include<bits/stdc++.h>
using namespace std
;
int ans
[101];
int as
,g
;
int main()
{
int n
;
char s
[100];
int k
,m
,flag
;
cin
>>n
;
for(int i
=2;i
<=36;i
++){
m
=n
;k
=0;flag
=0;
while(m
){
if(m
%i
>=0&&m
%i
<=9)
s
[k
++]=m
%i
+'0';
else
s
[k
++]=m
%i
-10+'A';
m
=m
/i
;
}
for(int j
=0;j
<k
;j
++){
if(s
[j
]!=s
[--k
]){
flag
=1;
}
}
if(flag
==0){
as
++;
ans
[++g
]=i
;
}
}
sort(ans
+1,ans
+g
+1);
cout
<<as
<<endl
;
for(int i
=1;i
<=g
;i
++){
cout
<<ans
[i
]<<endl
;
}
return 0;
}