埃拉托色尼的筛子和哥德巴赫猜想

The Sieve of Eratosthenes and Goldbach's Conjecture

本文关键字:猜想 埃拉托      更新时间:2023-10-16

埃拉托色尼的筛子和哥德巴赫猜想

实施埃拉托色尼筛并用它来找到所有素数 小于或等于一百万的数字。使用结果来 证明哥德巴赫猜想对于 4 和 4 之间的所有偶数 一百万,含。

使用以下声明实现函数:

void sieve(int array[], int num); 此函数将整数数组作为其参数。数组 应初始化为值 1 到 1000000。这 函数修改数组,以便只保留质数; 所有其他值均归零。 必须编写此函数以接受任何 大小。您必须输出 1 到 1 之间的所有素数 1000000,但是当我测试您的函数时,它可能在 不同的尺寸。

使用以下声明实现函数:

void goldbach(int array[], int num); 此函数采用与前一个函数相同的参数 并显示 4 到 1000000 之间的每个偶数,其中两个 添加到它的质数。 这里的目标是提供有效的实现。这 表示在确定 数字是素数。这也意味着第二个函数必须找到 两个素数有效。

程序输出:1 到 1000000 之间的所有质数 以及 4 到 1000000 之间的所有偶数和两个素数 数字加起来。

请勿为此项目提供输出或会话记录!

这是我到目前为止的代码,我的问题是它将大于 1,000 的数字显示为 1s,我该怎么做,谢谢!

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
void sieve(int array[], int num);
void goldbach(int array[], int num);
const int arraySize = 1000000;
int nums[arraySize];
int main(){
for (int i = 0; i <= arraySize; ++i)
nums[i] = 1;
nums[0] = nums[1] = 0;
sieve(nums, arraySize);
for(int i = 0; i < 10000; ++i){
if (nums[i] > 0){
cout << nums[i] << " "; 
}
}
goldbach(nums, arraySize);
return 0;
}

void sieve(int array[], int num) {
int squareR = (int)sqrt(num);
for(int i = 2; i <= squareR; ++i){
int k;
if(array[i]){
for(k = i*i; k <= num; k += i)
array[k] = 0;
}
if (array[i] == 1){
array[i] = i;   
}     
}
}

void goldbach(int array[], int num){
int i, r = 0;
for (i = 4; i <= num; i += 2){
for (int j = 2; j <= i/2; j++)
if (array[j] && array[i-j]) r ++;
}
}

我的问题是它将大于 1,000 的数字显示为 1,我该怎么做

这是因为您没有在此处更新 1000 以上的数组中的值:

for(int i = 2; i <= squareR; ++i){
...
if (array[i] == 1){
array[i] = i;

显然,squareR 上方的数组条目不会更新,而是保留在您初始化它们的值上,即1.

但是我你根本不需要这个更新。您可以删除它并简化代码,将数组的条目保留为 1(对于素数)或 0(对于非素数)。有了这个,并像这样显示您的结果(以main为单位):

for(int i = 0; i < arraySize; ++i){
if (nums[i] != 0){
// cout << nums[i] << " "; // <-- drop this
cout << i << " ";          // <-- use this
}
}