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<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~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值