C++ 索菲·热末质数
质数是大于1的数字,它们只有两个因数:数字本身和因数1。这意味着除了1和数字本身以外,没有任何数字可以被这些数字整除而不留下余数。例如,前十个质数是2、3、5、7、11、13、17、19、23和29。如果我们取数字2,因数就是2和1。也就是数字本身和因数1。同样,如果我们取数字11,因数就是11和1。也就是数字本身和因数1。现在我们已经清楚了什么是质数,是时候进入我们的主题了,即索菲·热末质数。
那么什么是索菲·热末质数呢?
在数论中,如果一个质数p满足2p+1也是一个质数,那么它被称为索菲·热末质数。数论是研究整数和算术函数的学科。
2、3、5、11、23、29、41、53、83、89、113、131、173、179、191、233、239、251、281、293、359等等。这些是最初的索菲·热末质数。
问题陈述
实现一个程序来打印索菲·热末质数。
方法
我们首先取这个数字并检查它是否是一个质数。也就是说,它的因数是否为1和这个数字本身。如果它是一个质数,我们继续下一步。也就是说,我们将这个数字乘以2,并加1。得到的结果我们进行检查,判断结果是否是一个质数。如果两个条件都符合,并且在两种情况下所得到的数字都是质数,那么这个数字就是一个索菲·热末质数。
示例1
假设p=2,它是一个质数,2p+1 = (2*2) + 1 = 5。由于2和5都是质数,所以2被称为索菲·热末质数。
示例2
类似地,假设p=3,它是一个质数,2p+1 = (2*3) + 1 = 7。由于2和7都是质数,所以3被称为索菲·热末质数。
示例3
让我们来看另一个例子,假设p=7,它是一个质数,2p+1 = (2*7) + 1 = 15。由于15不是一个质数,7不能称为索菲·热末质数。
C程序打印索菲·热末质数。
示例
#include<stdio.h>
#include <stdbool.h>
#include <string.h>
// function to detect prime number sieve method is used to check whether the number is prime or not.
bool sieve(int n, bool primeNum[]) {
for (int p = 2; p * p <= n; p++) {
// If prime[p] is not changed, then it is a prime
if (primeNum[p] == true) {
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
primeNum[i] = false;
}
}
}
void SophieGermainPrime(int n) {
bool primeNum[2 * n + 1];
memset(primeNum, true, sizeof(primeNum));
sieve(2 * n + 1, primeNum);
for (int i = 2; i <= n; ++i) {
// checking each i if it is Sophie germain prime or not.
if (primeNum[i] && primeNum[2 * i + 1])
printf("%d ",i);
}
}
int main() {
int n = 50;
printf("Sophie Germain Primes below 50: ");
SophieGermainPrime(n);
return 0;
}
输出
执行后,它将产生以下输出:
Sophie Germain Primes below 50: 2 3 5 11 23 29 41
结论
同样地,我们可以通过输入值来确定给定的数字是不是一个Sophie Germain质数。本文解决了确定给定的数字是否为Sophie Germain质数的挑战。下面提供了相应的C编程代码。