NC23757. 平方回文数
描述
从左向右念和从右向做念都一样的数,我们称它为回文数。如45654就是一个典型的回文数。
现在只考虑大于等于1小于等于300的数,如果它的平方在进制B(2<=B<=20)下是回文数,则输出。10,11,12……用’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))