C++ 乐乐的回文
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
#include
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;//如果不是回文(从左往右和从右往左不一样)返回falsei++;//往右一位数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~
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
