题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如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可扩展到任意正整数,不受位数限制。
真♦完美通关!
原文地址:https://www.cnblogs.com/jiangyuechen/p/12234855.html
时间: 2024-10-16 02:41:26