Description
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用 B 进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
Input
共一行,一个单独的整数B(B用十进制表示)。
Output
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
Sample Input
10
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
题意:
输入 一个 B ,代表几进制,然后输出 所有的 1<= x <= 300 (十进制下)且它的 平方 用 B 进制表示时是回文数的数
思路:
暴力 1- 300 之间的数,判断该数的平方是不是 回文数,如果是的话,就去输出该数
转化进制数 : 除 B 取 模
while(x)
{
s[cnt++] = x%B;
x /= B;
}
CODE:
不知道这个样子 printf("%c",ss[i]-10+'A'); 就不对呢,WA 了我好几次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define memset(a,n) memset(a,n,sizeof(n))
typedef long long LL;
LL s[302];
LL ss[302];
LL cnt = 0;
LL judge1(LL x,LL y)
{
LL k = 1;
cnt=0;
while(x)
{
s[cnt++] = x%y;
x /= y;
}
for (LL i = 0; i < cnt/2; i++) // 判断是不是回文数
if (s[i] != s[cnt-i-1])
{
k = 0;
break;
}
if (k == 1)
return 1;
else
return 0;
}
void judge(LL a,LL b,LL n)
{
int flag, flagg;
char c,cc;
flagg = 0;
memset(s,0);
memset(ss,0);
flag = judge1(a,n);
if(flag) // 如果是回文数的话,输出
{
while(b)
{
ss[flagg++] = b%n;
b /= n;
}
for (LL i = flagg-1; i >= 0; i--)
{
if (ss[i] <= 9)
cout<<ss[i];
else{
c=ss[i]-10+'A'; // !!! 这里当数大于 10 的时候,只能输出 A B ...
cout<<c;
}
}
cout<<' ';
for (LL i = cnt-1; i >= 0; i--)
{
if (s[i] <= 9)
cout<<s[i];
else
{
cc=s[i]-10+'A';
cout<<cc;
}
}
cout<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
LL n;
cin>>n;
for(LL i = 1; i <= 300; i++)
{
memset(s,0);
memset(ss,0);
cnt=0;
judge(i*i,i,n);
}
}