1149: 5007 回文数

题目描述

如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,75457就是一个回文数。
当然,这种性质要取决于这个数是在什么进制下。例如,17在十进制下不是一个回文数,但在二进制下(10001)则是一个回文数。
题目要求你来验证给定的数在2~16进制中的哪些进制下是否是回文数。

输入

输入文件包含了若干个十进制整数n,0 < n < 50000,每个整数占一行。0表示结束。

输出

如果整数i在某些进制下是回文数,则输出“Number i is palindrom in basis”,然后分别输出这些进制,其中i是给定的整数。如果在2~16进制下都不是回文数,则输出“Number i is not palindrom”。

样例输入 复制

17
19
0

样例输出  复制

Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
#include<iostream>
#include<cstring>
#include<algorithm>
const int N = 100000;
using namespace std;
int base1(int n,int r)
{
    int a[N];
    int b[N];
    int temp = 0;
    int len = 0;
    while(n)
    {
        a[len] = n%r;
        n/=r;
        len++;
    }
    for(int i = len-1;i>=0;i--)
    b[len-1-i] = a[i];
    for(int i = 0;i<len;i++)
    {
        if(b[i]==a[i])
        temp++;
    }
    if(temp==len)
    return 1;
    else
    return 0;
}
int base2(int n,int r)
{
    char str[N];char copy[N];
    int len = 0;
    int tem = 0;
    while(n)
    {
        int mod = n%r;
        if(mod<10)
        str[len] = '0'+mod;
        else
        str[len] = 'A'+mod-10;
        n/=r;
        len++;
    }
    for(int i = len-1;i>=0;i--)
    copy[len-1-i] = str[i];
    for(int i = 0;i<len;i++)
    {
        if(copy[i]==str[i])
        tem++;
    }
    if(tem==len)
    return 1;
    else
    return 0;
}
int main()
{
    int n;
    int count[N];
    while(scanf("%d",&n)!=EOF)
    {
        int res = 0;
        //判断一下条件
        if(n==0)
        break;
        for(int i = 2;i<=10;i++)
        {
           if(base1(n,i)==1)
            count[i]=1;
        }
        for(int i = 11;i<=16;i++)
        {
           if(base2(n,i)==1)
            count[i]=1;
        }
        //判断一下能不能用
        for(int i = 2;i<=16;i++)
        {
           if(count[i]!=0)
            res++;
        }
        if(res!=0)
        {
            printf("Number %d is palindrom in basis ",n);
            for(int i =2;i<=16;i++)
            {
                if(count[i]!=0)
                printf("%d ",i);
            }
            printf("\n");
        }
        else
        {
            printf("Number %d is not a palindrom\n",n);
        }
        memset(count,0,10000);
    }
    return 0;
}

题目比较简单容易思考,但我代码量实在是打的太高了,纯纯暴力解法,简单说一下思路吧,我们需要两个进行判断是否是回文数的数组,第一个是我们的在10以内只有数字没有字母,但是当大于10的时候,就会产生字母这时候用char数组,这里用判断回文一个最简单的办法,就是进行反转,用一个数组记录反转的数组,进行计数,如果计数的长度和len相等就是回文串,然后我们用count数组进行一个遍历,只要是回文就改成1,然后就是为了输出的代码,判断下count里有没有1,有一就进行正常输出,没有1的话我们就要进行直接输出不是回文串,所以需要分两种情况进行判断,没思考,纯纯暴力的解法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值