回文平方(3月24日)

题目描述

回文数是指数字从前往后读和从后往前读都相同的数字。

例如数字 1232112321 就是典型的回文数字。

现在给定你一个整数 BB,请你判断 11∼300300 之间的所有整数中,有哪些整数的平方转化为 BB 进制后,其 BB 进制表示是回文数字。
输入格式

一个整数 BB。
输出格式

每行包含两个在BB 进制下表示的数字。

第一个表示满足平方值转化为 BB 进制后是回文数字那个数,第二个数表示第一个数的平方。

所有满足条件的数字按从小到大顺序依次输出。
样例
输入数据 1

10

输出数据 1

1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696

输入数据 2

12

输出数据 2

1 1
2 4
3 9
11 121
22 484
101 10201
111 12321
121 14641
12B 16661
131 16B61
202 40804
204 41414

数据范围

2≤B≤202≤B≤20

对于大于 99 的数字,用 AA表示 1010,用 BB 表示 1111,以此类推。

解题思路:首先要搞清楚题目的意思,题目是说从1到300的每个数的平方转化为对应的进制后是回文数,那么就是一个满足的条件,输出这个数在给的进制下的结果还有其平方下的该进制的结果.那么思路大体就是将平方数输入后判断该值转为给与进制后是否为回文数,如果是那么就直接将其没平方的数转为给与进制打印,在打印该进制.代码如下:

#include<iostream>
using namespace std;
int b,num;
char c[10]={'A','B','C','D','E','F','G','H','I','J'};
int ans[10000];
int fun(int m)
{
	int a,cnt=1;  //进制转换的余数 
	while(m)
	{
		a=m%b;
		m/=b;
		ans[cnt]=a;
		cnt++;
		//cout<<ans[cnt-1];	
    }
 
	return cnt-1;
	
}
bool func(int k)
{
	int cnt=fun(k);
	if(cnt%2!=0)
	{
		for(int i=cnt,j=1;i>=cnt/2+1;i--)
		{
			if(ans[i]==ans[j]&&i!=j)
			{
				j++;
			}
			else if(ans[i]!=ans[j])
			{
				return false;
			}
			else if(i==j) return true;
		}
	}
	else
	{
		for(int i=cnt,j=1;i>=cnt/2+1;i--)
		{
			if(ans[i]==ans[j]&&i!=j+1)
			{
				j++;
			}
			else if(ans[i]!=ans[j])
			{
				return false;
			}
			else if(i==j+1) return true;
		}
	}
	
}
int main()
{
	
	
	cin>>b;
	for(int i=1;i<=300;i++)
	{
		num=i*i;
		if(func(num))
		{
		   for(int j=fun(i);j>=1;j--)
		   {
		   	if(ans[j]>9)
		   	{
		   		cout<<c[ans[j]%10];
			   }
			   else
		   	 cout<<ans[j];
			} 
		   cout<<" ";
		   for(int k=fun(num);k>=1;k--)
		   {
		   	if(ans[k]>9)
		   	{
		   		cout<<c[ans[k]%10];
			   }
			   else cout<<ans[k];	
			} 
			cout<<endl;
		}
		else continue;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值