C++ 中的 emirp 数
Emirp 数是一类特殊的数,它是质数,其数字倒过来构成的数也是质数(此质数不同于原来的数)。
Emirp 是 prime 的倒序拼写。
一些不是 emirp 数的质数是回文质数和一位数的质数。
一些 emirp 数 有 13、17、37、733。
打印出小于 n 的所有 emirp 数的程序。
在这里,给定一个数 n,我们需要打印出小于或等于 n 的所有emirp 数 。
我们举个例子来理解这个问题,
输入: n = 40
输出: 13, 17, 31, 37
解决方案
要找到所有小于给定数的 emirp 数,我们需要找到小于 n 的所有质数,然后检查数字是否为其倒序数字构成的质数,如果是 emirp 数,则打印该数。
用于找到 n 之前的质数,然后再重新检查其倒序数字的最佳方法是使用埃拉托斯特尼筛法。
用于说明我们解决方案工作原理的程序,
示例
#include <bits/stdc++.h> using namespace std; int reverseDigits(int x) { int digitRev = 0; while (x > 0) { digitRev = (digitRev*10) + x%10; x = x/10; } return digitRev; } void findAllEmirpNumber(int n) { bool primeNo[10001]; memset(primeNo, true, sizeof(primeNo)); for (int p=2; p*p<=10001; p++) { if (primeNo[p] == true) { for (int i=p*2; i<=10001; i += p) primeNo[i] = false; } } for (int p=2; p<=n; p++) { if (primeNo[p]) { int revNo = reverseDigits(p); if (p != revNo && primeNo[revNo]) { cout<<p<<"\t"; if(revNo <= n) cout<<revNo<<"\t"; primeNo[revNo] = false; } } } } int main() { int n = 40; cout<<"All Emirp numbers less than or equal to "<<n<<" are\n"; findAllEmirpNumber(n); return 0; }
输出
All Emirp numbers less than or equal to 40 are 13 31 17 37
广告