天天看点

palsquare-section1.2

题目大意

给定一个进制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;

}