第二层第四题:回文平方数

该博客探讨了在给定基数B(2到20)下,寻找并输出1到300之间平方后为回文数的所有整数及其平方值。内容包括问题描述、输入输出格式、样例输入输出以及简单的解决思路,即通过枚举法检查每个数的平方是否为回文数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Palindromic Squares
Rob Kolstad

Palindromes are numbers that read the same forwards as backwards. Thenumber 12321 is a typical palindrome.

Given a number base B (2 <= B <= 20 base 10), print all the integersN (1 <= N <= 300 base 10) such that the square of N is palindromic whenexpressed in base B; also print the value of that palindromic square. Use theletters 'A', 'B', and so on to represent the digits 10, 11, and so on.

Print both the number and its square in base B.

PROGRAM NAME: palsquare

INPUT FORMAT

A single line with B, the base (specified in base 10).

SAMPLE INPUT (file palsquare.in)

10

OUTPUT FORMAT

Lines with two integers represented in base B. The firstinteger is the number whose square is palindromic; the second integer is thesquare itself. NOTE WELL THAT BOTH INTEGERS ARE IN BASE B!

SAMPLE OUTPUT (file palsquare.out)

1 1

2 4

3 9

11 121

22 484

26 676

101 10201

111 12321

121 14641

202 40804

212 44944

264 69696

 

       题目大意:若一个数在B进制下为回文数,且为另一个数的平方,则称该数为B进制下的回文平方数。题目给出B(2≤B≤20),求出所有平方根不大于300的回文平方数,输出它们的平方根和它们。

       这题就不用说了吧。。。从1到300枚举,将它们的平方转化为B进制,判断是否为回文数。若是,则输出。

       代码附上:

/*
ID:su1q2d2
LANG:C++
TASK:palsquare
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxnum 60
#define maxn 100
using namespace std;
char num[maxnum]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
void cn(int n,int b,char ans[])
{
	int i=0;
	while(n>0){
		ans[i]=num[n%b];
		n/=b;
		i++;
	}
	ans[i]='\0';
	return ;
}
bool pal(char x[])
{
	int i;
	int n=strlen(x);
	for(i=0;i<n;i++){
		if(x[i]!=x[n-i-1]) return false;
	}
	return true;
}
char sqrr[maxn];
char base[maxn];
int main()
{
	freopen("palsquare.in","r",stdin);
	freopen("palsquare.out","w",stdout);
	int B;
	int n;
	int i;
	int j;
	scanf("%d",&B);
	for(i=1;i<=300;i++){
		cn(i*i,B,sqrr);
		if(pal(sqrr)){
			cn(i,B,base);
			n=strlen(base);
			for(j=n-1;j>=0;j--) printf("%c",base[j]);
			printf(" ");
			n=strlen(sqrr);
			for(j=0;j<n;j++) printf("%c",sqrr[j]);
			printf("\n");
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值