• 1155.回文三位数


    题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的既是回文数又是素数的三位数。

    先放代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    bool isZhi(int a)
    {
        if(a==1)return false;
        for(int i=2;i<a;i++)
        {
            if(a%i==0)return  false;
         } 
         return true;
    }
    int main()
    {
        for(int i=100;i<1000;i++)
        {
            if(isZhi(i)&&i/100==i%10)
               cout<<i<<endl;
        }
    }

    isZhi返回参数是否为质数。main中i/100和i%10分别获取i的第三位和第一位。

    然后完美通关!

    怎么还有?

    很明显,上述代码只适用于三位数。更高位数就无能为力了。

    于是,在我苦思冥想并且嫖了网上几段代码后,我编写了更加通用的代码。

    思路:从数字的第一位和最高位分别向中间逼近,遇到不同的数字则表明不是回文数。

    于是,我先写了获取数字位数的函数:

    int get_length(int a)
    {
        int leng=0;
        while(a)
        {
            a/=10;
            leng++;
        }
        const int _leng=leng;
        return _leng;
    }

    所得数字不断除以10,每除一次位数+1.除到0则停止,此时代表所有的位数都已算尽。

    upd:2020.7.6:竟然现在才发现log一下就行,可惜当时还没学

    考虑到可能需要常量,我进行了常量转化。当时第一版我使用的是字符串保存数字,但不太好使放弃了。这个常量转化可以忽略了。

    然后是获取某一个数字(第一个形参)的某一位(第二个形参)的数字。

    int getCertainNumOfInt(int a,int num)
    {
        int ten=1,q;
        for(q=1;q<num;q++)
        {
            ten*=10;
        }
        int r=a/ten%10;
        return r;
    }

    以12345为例,假设我们要获取第3位数,此时ten变量的值是100,12345/100=123,再用10对123取余,获得3即为第三位数。

    最后是检验回文数的函数:

    bool isBack(int a)
    {
        int len=get_length(a);
        for(int i=1;i<=len;i++)
        {
            if(getCertainNumOfInt(a,i)!=getCertainNumOfInt(a,len-i+1))
            return false;
        }
        return true;
    } 

    第六行是重点,i为从低位到高位的检查,len是长度。len-i+1是从高位到低位的检查(+1是因为,i原先就是1,不加1会使函数从数字次高位开始检查,漏掉最高位)。一旦检查到不同的数字就返回假。若所有数字都检查完毕,还没有发现不同的数字,则证明是回文数,返回真。

    或许可以将第四行的len改为len/2,因为两个检查量到中间时就已经能判断是否为回文数了。

    最后是main:

    int main()
    {
        for(int p=100;p<=999;p++)
        {
            if(isBack(p)&&isZhi(p))
            cout<<p<<endl;
        }
    }

    此时的p可扩展到任意正整数,不受位数限制。

    真♦完美通关!

  • 相关阅读:
    模板实参演绎
    模板实例化
    模板中的名称
    友元函数在类中的声明在外围是不可见的
    C++ 宽字符(wchar_t)与窄字符(char)的转换
    ImageButton如何让图片按比例缩放不被拉伸
    C++模板实例化(1)
    android开发之GenyMotion与intelliJ的配置
    jacoco报告表头注释
    Spring源码工具类之StringUtils
  • 原文地址:https://www.cnblogs.com/jiangyuechen/p/12234855.html
Copyright © 2020-2023  润新知