回文平方数
作者: xxx 时间限制: 1S 章节: 一维数组
问题描述 :
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2=<B<=20进制),输出所有的大于等于1小于等于300且该数的平方用B进制表示时是回文数的数(该数本身不要求是回文数)。
输入说明 :
共一行,一个单独的整数B(B用十进制表示,比如18)。
输出说明 :
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。
注意:输出时,这两个数都应该以B进制表示。
在输出时,数字10到20分别以A到K代替。
输入范例 :
20
输出范例 :
1 1
2 4
3 9
4 G
11 121
22 484
25 515
33 9I9
DD 9669
#include<stdio.h>
int n,square,an[1000000],bb[1000000];
int turn(int a,int b){//求B进制数并在数组中存储各位数
int i;
for(i=0;;i++){
an[i]=b%a;
b=b/a;
if(b==0)
break;
}
return i;//返回B进制下的位数
}
int f(int n){//判断是否为回文数
for(int i=0;i<=n;i++)
if(an[i]!=an[n-i])
return 0;
return 1;
}
void print(int a,int b){//输出这个数及其平方数
int i;
for(i=0;;i++){
bb[i]=b%a;
b=b/a;
if(b==0)
break;
}
for(i=i;i>=0;i--)
if(bb[i]>9)
printf("%c",bb[i]-10+'A');//ASCII值对应的字母用于十以上进制的数
else printf("%d",bb[i]);
}
int main(){
int i;
scanf("%d",&n);
for(i=1;i<=300;i++){
square=i*i;
int j=turn(n,square);
if(f(j)){
print(n,i);
putchar(32);
for(int k=0;k<=j;k++)
if(an[k]>9)
printf("%c",an[k]-10+'A');
else printf("%d",an[k]);
putchar(10);
}
}
return 0;
}