码迷,mamicode.com
首页 > 其他好文 > 详细

1155.回文三位数

时间:2020-01-26 22:06:11      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:函数   检查   并且   style   参数   怎么   i++   正整数   ++   

题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如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则停止,此时代表所有的位数都已算尽。

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

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

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可扩展到任意正整数,不受位数限制。

真♦完美通关!

1155.回文三位数

标签:函数   检查   并且   style   参数   怎么   i++   正整数   ++   

原文地址:https://www.cnblogs.com/jiangyuechen/p/12234855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!