题目大意
现在给定你一个整数 B,请你判断 1∼300 之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B 进制表示是回文数字。
输入
一个整数B
输出
每行包含两个在 B 进制下表示的数字。
第一个表示满足平方值转化为 B 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。
#include <iostream>
#include <string.h>
using namespace std;
char arr[20];//存放原数的平方的B进制
char brr[10];//存放原数的B进制
int change(int a, int b, char* arr)//将数字a转换为b进制并存放在数组arr里面
{
int i = 0;
char s = 'A';
while (a)
{
char ss = (a % b) + '0';
if (a % b >= 10)ss = s + (a % b - 10);
arr[i++] = ss;
a /= b;
}
return i;
}
int judge(int len)//判断存放原数的平方转化为B进制是否为回文数(存放在数组arr里面)
{
int j = len - 1;
for (int i = 0; i <= (len - 1) / 2; i++)
{
if (arr[i] != arr[j--])
{
return 0;
}
}
return 1;
}
void print(char* arr, int len)//打印转为B进制后的数,len为数组长度
{
for (int j = len - 1; j >= 0; j--)
cout << arr[j];
}
int main(void)
{
int n, len;
cin >> n;
int sum = 0;
for (int i = 1; i <= 300; i++)
{
memset(arr, 0, sizeof(arr));//清空数组
memset(brr, 0, sizeof(brr));
sum = i * i;
int len = change(sum, n, arr);
if (judge(len))//如果是回文数
{
print(brr, change(i, n, brr));//打印原数
cout << ' ';
print(arr, len);//打印原数的平方
cout << endl;
}
}
return 0;
}
c++string字符串做法
#include <bits/stdc++.h>
using namespace std;
string str = "0123456789ABCDEFGHIGKLMNOPQRSTUVWSYZ";//定义一个字典
string res;
string change(int a, int b)//返回字符串类型
{
res = "";//每回清空,防止原数和原数平方造成错误
while (a)
{
res.insert(res.begin(), str[a % b]);//将转化后的B进制各位逆向添加到res字符串
a /= b;
}
return res;
}
int judge()
{
string temp = res;
reverse(res.begin(), res.end());//字符串倒序判断回文
if (temp != res)return 0;
return 1;
}
int main(void)
{
int n;
cin >> n;
for (int i = 1; i <= 300; i++)
{
change(i * i, n);
if (judge())//如果是回文数
{
cout << change(i, n) << ' ' << change(i * i, n) << endl;
}
}
return 0;
}