题目大意
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
输入格式
line 1:B(一个整数,表示进制)
输出格式
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数.
样例输入
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
题解
遍历十进制下1-300的所有数,将其平方用B进制表示,判断是否是回文数,如果是则按要求输出,不是则查看下一个
代码
#include<stdio.h>
#include<string.h>
int huiwen(char str[20],int len)
{
int i;
for(i=0;i<len;i++)
{
if(str[i]!=str[len-1-i])
return 0;
}
return 1;
}
/*char b(int a)
{
char b;
if(a<10)
b=a+'0';
else
b='A'+a-10;
printf("%c\n",b);
return b;
}*/
int base(long int n,int m,char *str)
{
char str1[20];
int i=0,j=0;
while(n)
{
if(n%m<10)
str1[i]=n%m+'0';
else
str1[i]=n%m-10+'A';
n=n/m;
//printf("%c\n",str1[i]);
i++;
}
i--;
for(j=0;j<=i;j++)
{
str[j]=str1[i-j];
}
return i+1;
}
int main()
{
int B,i,j,len,len1;
fscanf(fin,"%d",&B);
char str[20],str1[10];
for(i=1;i<=300;i++)
{
len=base(i*i,B,str);
if(huiwen(str,len))
{
len1=base(i,B,str1);
for(j=0;j<len1;j++)
printf("%c",str1[j]);
printf(" ");
for(j=0;j<len;j++)
printffout,"%c",str[j]);
printf("\n");
}
}
return 0;
}