16进制转10进制 nodejs_常州市赛题解:小X转进制

这篇博客介绍了如何解决寻找1到N中平方数在M进制下为回文数的问题,特别是当M小于等于16时。通过使用打表法,将16进制数转换为字符串进行判断,对于不超过10000的N,避免了数值溢出。代码示例使用C++实现,包括关键算法和逻辑。
摘要由CSDN通过智能技术生成

小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++)专题二:一维数组

相关编程技术和学习等方面的问题请联系下方老师咨询

4734e90568a746ae633d69cf48152b05.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值