Emirp 号是一种特殊的数字类型,它是质数,当其数字反转时,会产生另一个质数(该质数与原始质数不同)。
一些不是emirp的质数是回文质数和个位数质数。
一些Emirp号码是13、17、37、733 。
在这里,给我们一个数字n,我们需要打印所有小于或等于n的emirp数字 。
让我们举个例子来了解这个问题,
输入: n = 40
输出: 13,17,31,37
要找到所有小于给定数字的emirp数,我们需要找到所有小于n的素数,然后检查通过反转其数字形成的数字是否是比其emirp数为质数的数字,请打印出来。
为了找到直到n的质数,然后重新检查其反数,最好的方法是使用Eratosthenes筛。
#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<<"所有Emirp数小于或等于 "<<n<<" are\n";
findAllEmirpNumber(n);
return 0;
}输出结果所有Emirp数小于或等于 40 are 13 31 17 37