问题描述 :
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2=<B<=20进制),输出所有的大于等于1小于等于300且该数的平方用B进制表示时是回文数的数(该数本身不要求是回文数)。
输入说明 :
共一行,一个单独的整数B(B用十进制表示,比如18)。
输出说明 :
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。
注意:输出时,这两个数都应该以B进制表示。
在输出时,数字10到20分别以A到K代替。
解题方法: 定义三个函数 ①判断是否是回文数 ②将一个数字转化成对应的B进制数存放在数组中以供判断是否是回文数 ③转换成对应的进制数 并存储至数组中 而printf
#include<cstdio>
#include <iostream>
using namespace std;
int arr[1000000];
int brr[1000000];
int change1(int B, int i);
int huiwen(int k);
void print(int a, int b);
int main()
{
int B;
cin >> B;
for (int i = 1; i <= 300; i++)
{
int k = change1(B, i * i);
if (huiwen(k))
{
print(B, i);
printf(" ");
print(B, i * i);
printf("\n");
}
}
return 0;
}
int change1(int B, int i)
{
int k = 0;
while (i != 0)
{
arr[k++] = i % B;
i /= B;
}
return k;
}
int huiwen(int k)
{
for (int i = 0; i < k; i++)
{
if (arr[i] != arr[k - 1 - i])
return 0;
}
return 1;
}
void print(int a, int b)
{
int i;
for (i = 0;; i++)//取出每一位放在新的数列中 和改变进制的数组分开 避免混淆
{
brr[i] = b % a;
b = b / a;
if (b == 0)
break;
}
for (i = i; i >= 0; i--)
if (brr[i] > 9)
printf("%c", brr[i] - 10 + 'A');
}