2288: 【基础】小X转进制

2288: 【基础】小X转进制
时间限制: 1 Sec 内存限制: 256 MB
提交: 1316 解决: 576
[提交] [状态] [讨论版] [命题人:ghost79]

题目描述
小X喜欢研究进制转换。 
 在了解了进制转换的一般流程后,小X突然想起了以前学过的回文数(正着读倒着读都一样的数),于是开始思考一个奇怪的问题:1到N 中有多少个整数的平方在M进制下是回文数呢?  
小X随手列了几个: 
   2的平方410进制表示为4,是回文数; 
   3的平方92进制表示为 1001,是回文数; 
   9046的平方8183011616进制表示为4E0A0E4,是回文数。 
 小X觉得要全列出来太难了,希望你帮帮他。


输入
第一行包含用一个空格隔开的两个整数N,M。


输出
第一行包含一个整数,表示满足要求的整数个数。


样例输入
2 10

样例输出
2

提示
数据范围
   对于30%的数据,M=10。
   对于另外30%的数据,M=2。
   对于 100%的数据,1≤N≤100002≤M≤16

来源/分类
常州市2015“信息与未来”夏令营选拔赛


题解如下

#include<stdio.h>
#include<string.h>

int main()
{
    int m,b;
    scanf("%d%d",&m,&b);
    int sum=0;
    for(int o=1;o<=m;o++)
    {
        int n=o*o;
        char ar[20];
        for(int i=0;i<20;i++)
        {
            if(i<=9)
                ar[i]=i+'0';
            else
                ar[i]=i+55;
        }

        char result[999];

        int count_zero=0;
        int position=0;
        if(n==0)
        {
            //printf("0");
            result[position++]='0';
        }
        else
        {
            for(int i=0; ;i++)
            {
                if(n%b==0)
                {
                    count_zero++;
                    n/=b;
                }
                else
                    break;

            }
            for(int j=0; ;j++)
            {
                if(n/b!=0)
                {
                    //printf("%c\n",ar[n%b]);
                    result[position++]=ar[n%b];
                    n/=b;

                    //printf("@\n");
                }
                else
                {
                    //printf("#\n");
                    // printf("%c\n",ar[n]);
                    result[position++]=ar[n];
                    break;
                }

            }
            for(int i=0;i<count_zero;i++)
                //printf("0");
                result[position++]='0';
        }

        int LEN_re=(int)strlen(result);
        //printf("%d\n\n",LEN_re);
        int flag=1;
        for(int i=0;i<LEN_re/2;i++)
        {
            if(result[i]!=result[LEN_re-1-i])
                flag=0;
        }
        if(flag==1)
            sum++;
    }
    printf("%d",sum);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值