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个素