小X喜欢研究进制转换。在了解了进制转换的一般流程后,小X突然想起了以前学过的回文数(正着读倒着读都一样的数),于是开始思考一个奇怪的问题:1到N 中有多少个整数的平方在M进制下是回文数呢?
小X随手列了几个:
2的平方4,10进制表示为4,是回文数;
3的平方9,2进制表示为 1001,是回文数;
9046的平方81830116,16进制表示为4E0A0E4,是回文数。
小X觉得要全列出来太难了,希望你帮帮他。
输入
第一行包含用一个空格隔开的两个整数N,M。
输出
第一行包含一个整数,表示满足要求的整数个数。
样例
输入
2 10
输出
2
提示
数据范围
对于30%的数据,M=10。
对于另外30%的数据,M=2。
对于 100%的数据,1≤N≤10000,2≤M≤16。
解题方法:
由于M<=16,16进制数的10-15分别用字母A,B,C,D,E,F来表示,可以采用打表法,先将16进制的16位数位存入字符串(或字符数组),转换后的数去查表转换;由于n<=10000,平方以后再转换成2进制会爆int和long long ,所以转换以后的结果也采用字符串(或字符数组)。
#include
#include
using namespace std;
int main()
{
int m,b;
cin>>m>>b;
int sum=0;
for(int k=1;k<=m;k++)
{
int n=k*k;
string s;
for(int i=0;i<=15;i++)
{
if(i<=9)
s+=char('0'+i); //0-9
else
s+=char('A'+i-10);//10-15分别对应ABCDEF
}
string result;
int czero=0;
int position=0;
if(n==0)
result="0";
else
{
while(n%b==0)
{
czero++;
n/=b;
}
while(n/b!=0)
{
result+=s[n%b];
n/=b;
}
result+=s[n];
for(int i=0;i
result+=char('0');
}
int flag=1;
int l=result.size();
for(int i=0;i
{
if(result[i]!=result[l-1-i])
flag=0;
}
if(flag==1)
sum++;
}
cout<
return 0;
}
寒假课程启动报名,各项活动精彩纷呈
等级考试专题九:几种基础排序
等级考试专题八:二维数组(2)
等级考试专题六:二维数组(1)
等级考试2级(C/C++)专题三:一维数组应用实例
中国电子学会青少年软件编程等级考试2级(C/C++)专题二:一维数组
相关编程技术和学习等方面的问题请联系下方老师咨询