USACO palindromic squares 回文数平方

这篇博客介绍了USACO编程竞赛中关于回文数平方的问题,要求找到在特定进制B下,1到300(十进制)之间数的平方是回文数的数对。给出了输入输出格式及样例,并分享了解题思路,重点在于进制转换和回文数的判断。链接提供了详细的进制转换教程。

题目描述

回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。

给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等

输入格式:

共一行,一个单独的整数B(B用十进制表示)。

输出格式:

每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。

输入样例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

解题思路

主要就是一个进制转换,只要这个会了就无敌了。后面再用一个判断回文数就OK了
进制转换:https://blog.youkuaiyun.com/johnwayne0317/article/details/84980149

代码

#include <bits/stdc++.h>
using namespace std;
int jin;
int a[100],c[100];
int k;
int basecnt;
int basecnt2;
char b[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};

void many(int n){
	k=0;
	while(n!=0){
		n/=10;
		k++;
	}
	return ;
}

//change和change2是基本一样的,就是可以用两个不同的数组保存,这样写方便一点
void change(int n){
	basecnt=0;
	while(n!=0){
		a[basecnt]=n%jin;
		n/=jin;
		basecnt++;
	}
	return ;
}


void change2(int n){
	basecnt2=0;
	while(n!=0){
		c[basecnt2]=n%jin;
		n/=jin;
		basecnt2++;
	}
	return ;
}




int main(){
	cin>>jin;
	int tmp;
	bool tf=false;
	for(int i=1;i<=300;i++){
		memset(a,0,sizeof(a));
		memset(c,0,sizeof(c));
		//将原数与原数的平方的n进制都求出
		change2(i);
		tmp=i*i;
		change(tmp);
		} 
		many(tmp);


		//判断回文数
		tf=false;
		for(int j=0;j<basecnt;j++){
			if(a[j]!=a[basecnt-1-j]){
				tf=true;
			}
		}

		//输出,由于是回文数,其平方正的反的随意,也就是basecnt那个随意
		if(tf==false){
			for(int j=basecnt2-1;j>=0;j--){
				cout<<b[c[j]];
			}
			cout<<" ";
			for(int j=basecnt-1;j>=0;j--){
				cout<<b[a[j]];
			}
			cout<<endl;
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值