标签: | 模拟 | ||
详情: | 回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。 | ||
输入格式: | 共一行,一个单独的整数B(B用十进制表示)。 | ||
输出格式: | 每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。 | ||
提示: | USACO Training | ||
限制: | 每个测试点1秒 | ||
样例: |
|
需要学习的地方是:1)进制转换,其实不难,以下几行代码可以搞定。j表示需要转换的数字,n表示需要转换的进制。最后逆序输出就是转换后的结果。
while (j)//进制转换
{
a[++tot]=j%n;
j=j/n;
}
2)对于10以上包括10的数需要用ABCD等英文字母代替。强制转化。
printf("%c",(char)(a[l]+'A'-10));
代码如下:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int n;
int a[1000005],b[100005];
int main()
{
scanf("%d",&n);
for (int i=1;i<=300;i++)
{
int tot=0;
int j=i*i;
while (j)//进制转换
{
a[++tot]=j%n;
j=j/n;
}
bool o = true;
for (int k = 1;k <= tot/2;k++) //判断是否为回文
if (a[k]!=a[tot-k+1])
o = false;
if (o)
{
j = i;
int op = 0;
while (j) //进制转换
{
b[++op]=j%n;
j=j/n;
}
for (int l=op;l>0;l--)
if (b[l]>=10)
printf("%c",(char)(b[l]+'A'-10));
else
printf("%d",b[l]);
printf(" ");
for (int l=tot;l>0;l--)
if (a[l]>=10)
printf("%c",(char)(a[l]+'A'-10));
else
printf("%d",a[l]);
printf("\n");
}
}
return 0;
}