1.题目:
2.思路:
题目意思的将1-300的整数(i)的平方转换成B进制的,看转换之后的数是否是回文数,是回文数就输出这个整数(i)转换成B进制后的形式;若不是直接忽略。上代码!
3.代码:
#include<iostream>
#include<vector>
using namespace std;
int n,ans1,ans2,num;//ans1用来记录i*i;ans2记录i
char a[20],c[20];//a[20]记录一个整数转换成B进制时每一次整除取余的数;
char b[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
//b[20]表示每次整除取余的结果;比如,取余之后为10,对应的就是a[10]='A',a[8]='8';
int main()
{
cin>>n;
for(int i=1;i<=300;i++){
ans1=i*i;//ans1记录i*i
int st=0;//判断是否为回文数
int x=0;//记录i*i转换之后有多少个字符;
while(ans1){//转换成B进制,每一次都先取余,然后整除,达到转换效果;
a[x++]=b[ans1%n];//每一次整除取余对应的字符;
ans1/=n;
}
for(int j=0;j<x;j++){//遍历从一个字符到最后一个字符;
if(a[j]!=a[x-j-1]){//如果前面和后面对称的位置出现了不相等,就不是回文数,标记为1;
//否则就是回文数;st=0;
st=1;
break;
}
}
if(st==0){//如果是回文数;我们要先输出i转换成B进制后的形式,再输出i*i转换成B进制之后的
//形式
int num=0;//记录i转换成B进制之后有几个字符;
ans2=i;//ans2记录i;
while(ans2){//进制转换,和上面原理一样
c[num++]=b[ans2%n];
ans2/=n;
}
for(int l=num-1;l>=0;l--){
cout<<c[l];//从后往前输出;进制转化倒序取余拼在一起;不懂可去查一下怎么进制转换
}
cout<<' ';//题目要求
for(int k=0;k<x;k++){//因为上面就已经求过回文数,所以直接输出,因为是回文数,
//从前往后和从从后往前都一样
cout<<a[k];
}
cout<<endl;
}
}
return 0;
}