列表

详情


NC23757. 平方回文数

描述

从左向右念和从右向做念都一样的数,我们称它为回文数。如45654就是一个典型的回文数。

现在只考虑大于等于1小于等于300的数,如果它的平方在进制B2<=B<=20)下是回文数,则输出。101112……’A’,’B’,’C’……表示。

输入描述

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

输出描述

每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。(注意:这两个数都应该在B那个进制下)

示例1

输入:

10

输出:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 2ms, 内存消耗: 328K, 提交时间: 2023-03-25 16:07:48

#include<stdio.h>
#include<string.h>
int main()
{
	int B;
	scanf("%d",&B);
	int arr[1000],arr_num=0;
	int brr[1000],brr_num=0;
	for(int i=1;i<=300;i++)
	{
		arr_num=0;
		int t=i*i,flag=1;
		while(t>0)
		{
			arr[arr_num++]=t%B;
			t/=B;
		}
		for(int k=0;k<arr_num/2;k++)
		{
			if(arr[k]!=arr[arr_num-k-1])
			{
				flag=0;
				break;
			}

		}
		if(flag)
			{
				t=i;
				brr_num=0;
				while(t>0)
				{
					brr[brr_num++]=t%B;
					t/=B;
				}
				for(int k=brr_num-1;k>=0;k--)
					{
						if(brr[k]>=0&&brr[k]<=9)
							printf("%d",brr[k]);
						else
							printf("%c",brr[k]+55);
					}
				printf(" ");
				for(int k=0;k<arr_num;k++)
					{
						if(arr[k]>=0&&arr[k]<=9)
							printf("%d",arr[k]);
						else
							printf("%c",arr[k]+55);
					}
				printf("\n");
			}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 492K, 提交时间: 2020-03-25 22:36:12

#include<cstdio>
const char code[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K'};
char a[300],b[300];
int n,len=0,lenb=0;
bool work(int now)
{
	len=0;
	while(now!=0)
	{
		a[++len]=code[now%n];
		now/=n;
	}
	for(int i=1;i<=len/2;i++)
	if(a[i]!=a[len-i+1])
	return false;
	return true;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=300;i++)
	if(work(i*i))
	{
		lenb=0;
		int now=i;
		while(now!=0)
		{
			b[++lenb]=code[now%n];
			now/=n;
		}
		for(int j=lenb;j>0;j--)
		printf("%c",b[j]);
		printf(" ");
		for(int j=len;j>0;j--)
		printf("%c",a[j]);
		printf("\n");
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2019-04-03 21:15:50

#include<stdio.h>
#include<string.h>

const int MAX = 300;
int n;
char a[30], b[21] = { "0123456789ABCDEFGHIJ" };

int conversion(int num)
{
	int i = -1;
	while (num > 0)
	{
		a[++i] = b[num%n];
		num /= n;
	}
	return i;
}


int main()
{

	int i, j, p, k;
	char c[35];
flag:
	fflush(stdin);
	scanf("%d", &n);
	if (n < 2 || n>20) goto flag;
	for (i = 1; i <= MAX; i++)
	{
		k = conversion(i*i);
		p = 0;
		while (p <= k && a[p] == a[k])
		{
			p++;
            k--;
		}
		if (p > k)
		{
			strcpy(c, a);
			k = conversion(i);
			for (j = k; j >= 0; j--)
				printf("%c", a[j]);
			printf(" %s\n", c);
		}
	}
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 28ms, 内存消耗: 3432K, 提交时间: 2019-04-03 21:18:27

def trans(n,B):
    s=''
    L=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    while n!=0:
        a=n%B
        if a>=10:
            a=L[a-10]
        s=str(a)+s
        n//=B
    return(s)
B=int(input())
for i in range(1,301):
    #print(trans(i*i,B))
    s=trans(i*i,B)
    flag=0
    for j in range(len(s)//2):
        if s[j]!=s[len(s)-1-j]:
            flag=1
    if flag==0:
        print(trans(i,B),trans(i*i,B))

上一题