Accept: 218Submit: 367
Time Limit: 1000 mSecMemory Limit : 32768 KB
Problem Description
在猪的世界里有一种数叫猪数,猪是这么定义猪数的:给定一个进制B(2<=B<=20,B用十进制表示),在这个进制下,这个数的平方从左向右念和从右像左念都一样,用‘A’,‘B’……表示10,11等等。
例如:B=10时,121就是一个猪数,因为121的平方14641满足条件。
你的任务是编写一个程序,求出所有大于等于1小于等于300的猪数。
Input
输入包含多组测试数据,请处理到EOF结束。
每组测试数据,由一行组成,为一个单独的整数B(B用十进制表示)。
Output
对每组数据输出:每行两个数字,第二个数是第一个数的平方,且第一个数是猪数。(注意:这两个数都应该在B那个进制下)
Sample Input
10 15
Sample Output
1 1 2 4 3 9 11 121 22 484 26 676 101 10201 111 12321 121 14641 202 40804 212 44944 264 69696 2 4 3 9 4 11 8 44 C 99 11 121 14 191 22 484 29 6B6 44 1331 51 1AA1 88 4CC4 99 6226 101 10201 111 12321 121 14641 131 16B61
//题目的样例输出应该是有错的, B=15时, 最前面还有一行1 1
//一次就AC了,有点意外...
//基本的思想就是10进制转B进制(2<=B<=20), 判断该10进制数的平方在B进制下是否对称(猪数).....
#include<iostream>
using namespace std;
int B;
char c[100],ch[100];
bool isPD(int len)
{
int i;
for(i=0;i<len/2;i++)
if(c[i]!=c[len-1-i])
return false;
return true;
}
int main()
{
int i,j,tmp,len,len2,tt1,tt2,t;
while(scanf("%d",&B)!=EOF)
{
for(i=1;i<=300;i++)
{
tmp=i*i;
j=0;
while(tmp)
{
tt1=tmp%B;
if(tt1>=10) sprintf(&c[j],"%c",(char)('A'+tt1-10));
else sprintf(&c[j],"%d",tt1);
tmp/=B;
j++;
}
len=strlen(c);
if(len==1 || isPD(len))
{
t=i;
j=0;
while(t)
{
tt2=t%B;
if(tt2>=10) sprintf(&ch[j],"%c",(char)('A'+tt2-10));
else sprintf(&ch[j],"%d",tt2);
t/=B;
j++;
}
len2=strlen(ch);
for(j=len2-1;j>=0;j--)
printf("%c",ch[j]);
printf(" ");
for(j=len-1;j>=0;j--)
printf("%c",c[j]);
printf("/n");
}
}
}
return 0;
}