C/C++乐乐的回文
题目描述
乐乐最近喜欢研究回文数,假设一个数从左到右读跟从右到左读的结果是一样的,那么我们说这个数是一个回文数。 如果一个数在十进制下是回文的,我们说这个数是一重回文数,如果一个数在十进制和二进制下是回文的,我们说这个数是二重回文数,如果一个数在三种进制下是回文的,我们说这个数是三重回文数……。现在我们用数字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。
这道题就是转换进制,
首先回文数就是从右往左数或从左往右数都一样的数,所以我们用字符型的数组存
思路就是你循环2~32,在循环中首先将 n 转换为 i 进制的数,这个不难,用一个while就行。
接着判断是否回文,这个就用两个变量再加上循环就完成了
我写了两个函数判断它。C++代码如下:
#include<iostream>
#include<cstring>
using namespace std;
long long x,o[100],l=-1;
char a[100000];
int ans;
bool huiwen(char a[])//定义一个判断回文的函数,判断a[],是回文返回true,反之。
{
int i=0,j=strlen(a)-1;//定义两个变量,i是从左往右,j是从右往左
int len=strlen(a);//获取a的长度
for(int l=1;l<=len/2;l++)
{
if(a[i]!=a[j]) return false;//如果不是回文(从左往右和从右往左不一样)返回false
i++;//往右一位数
j--;//往左一位数
}
return true;//如果都一样(都不是不一样)返回true
}
void jinzhi(long long w,long long y)//将x变为i进制数存到a数组
{
int x=0,k=0;//w存每次余数,k是a数组坐标。
//因为a数组是全局变量,函数中可以改变
while(w>0)
{
x=w%y;//取余
if(x<10) a[k]=char(x+48);//如果目前余数是一位数,可以用数字存到a中
else a[k]=char(x-10+65);//如果目前余数是两位数,要变成大写字母,-10+65是自己想的
k++;//下标++
w/=y;//短除
}
}
int main()
{
cin>>x;
for(long long i=2;i<=36;i++)//循环2~36
{
jinzhi(x,i);//存转换完的进制a[]
if(huiwen(a)==true)//若a[]是回文数
{
ans++;//答案数++
o[++l]=i;//存答案进制
}
for(int t=0;t<=9999;t++) a[t]='\0';//清空a数组,用作下一个进制
}
cout<<ans<<endl;
for(int i=0;i<=l;i++) cout<<o[i]<<endl;
return 0;
}
上面就是《乐乐的回文》的题解了,88~