c语言求素数的和

在数学中,素数是指大于1的自然数,除了1和它本身以外不再有其他因数的数,例如2、3、5、7等都是素数,而素数和则是指一系列素数的和。

(图片来源网络,侵删)

C语言求素数和的方法

1. 判断素数的方法

要计算素数和,首先需要知道如何判断一个数是否为素数,常用的方法有以下几种:

(1)试除法

试除法是最简单也是最基本的判断素数的方法,从2开始,依次尝试将待判断的数除以小于等于它的平方根的所有整数,如果都不能整除,则该数为素数。

#include <stdio.h>
#include <math.h>
int isPrime(int num) {
    if (num <= 1) {
        return 0; // 小于等于1的数不是素数
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            return 0; // 能被整除的不是素数
        }
    }
    return 1; // 不能被整除的是素数
}

(2)埃氏筛法(埃拉托斯特尼筛法)

埃氏筛法是一种高效的判断素数的方法,通过筛选法找出一定范围内的所有素数,具体步骤如下:

1、初始化一个布尔数组,将所有元素设为true,表示每个数都是素数。

2、从2开始,将2的倍数标记为false,表示它们不是素数。

3、找到下一个未被标记为false的数,将其倍数标记为false,重复此步骤直到遍历完整个数组。

4、数组中仍为true的元素即为素数。

#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#define N 1000000 // 定义范围大小,可以根据需要调整
bool prime[N]; // 布尔数组,表示每个数是否为素数
void sieve() {
    for (int i = 2; i < N; i++) {
        prime[i] = true; // 初始时认为每个数都是素数
    }
    for (int i = 2; i * i < N; i++) { // 只需要遍历到平方根即可
        if (prime[i]) { // 如果当前数是素数,则将其倍数标记为非素数
            for (int j = i * i; j < N; j += i) {
                prime[j] = false;
            }
        }
    }
}

2. 求素数和的方法

求素数和的方法相对简单,只需要遍历一定范围内的所有素数,并将它们累加起来即可,可以使用上述的埃氏筛法来获取素数,然后进行累加操作,下面是一个示例代码:

#include <stdio.h>
#include <stdbool.h>
#define N 1000000 // 定义范围大小,可以根据需要调整
#define PRIME_COUNT 100 // 定义要计算的素数个数,可以根据需要调整
bool prime[N]; // 布尔数组,表示每个数是否为素数
int primeSum[PRIME_COUNT]; // 存储前PRIME_COUNT个素数的和的数组
int primeCount = 0; // 当前已找到的素数个数计数器
int currentNumber = 2; // 当前正在判断的数,从2开始递增
int sum = 0; // 当前已找到的素数之和,初始值为0
int nextIndex = 0; // 下一个要存储到primeSum中的素数值的索引,初始值为0
void sieve() {
    for (int i = 2; i < N; i++) {
        prime[i] = true; // 初始时认为每个数都是素数
    }
    for (int i = 2; i * i < N; i++) { // 只需要遍历到平方根即可
        if (prime[i]) { // 如果当前数是素数,则将其倍数标记为非素数
            for (int j = i * i; j < N; j += i) {
                prime[j] = false;
            }
        }
    }
}
void findPrimeSum() { // 求前PRIME_COUNT个素数的和的函数
    while (primeCount < PRIME_COUNT && currentNumber < N) { // 如果已找到的素数个数不足PRIME_COUNT且当前数字未超过N,则继续寻找下一个素数
        if (prime[currentNumber]) { // 如果当前数字是素数,则将其加入sum中,并更新primeSum数组和primeCount计数器的值,同时将nextIndex指向primeSum数组中下一个要存储的位置,最后将currentNumber加1继续寻找下一个素数,注意这里使用了取模运算来保证nextIndex始终在primeSum数组范围内,如果已经找到了PRIME_COUNT个素数或者currentNumber已经超过了N,则跳出循环。
				
				
		
		















nextIndex++;
				
	
if (nextIndex >= PRIME_COUNT) {
	break;
	}
	if (currentNumber >= N) {
	break;
	}
sum += currentNumber;
primeSum[nextIndex] = sum;
primeCount++;
currentNumber++;
currentNumber %= PRIME_COUNT;
while (!prime[currentNumber]) {
currentNumber++;
currentNumber %= PRIME_COUNT;
}
} else {
currentNumber++;
currentNumber %= PRIME_COUNT;
while (!prime[currentNumber]) {
currentNumber++;
currentNumber %= PRIME_COUNT;
}
}
}}}*/
int main() {
sieve();
findPrimeSum();
// 输出结果,可以根据实际情况进行调整,这里只输出前PRIME_COUNT个素

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。