Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erastothenes筛的C代码_C_Sieve Of Eratosthenes_Sieve - Fatal编程技术网

Erastothenes筛的C代码

Erastothenes筛的C代码,c,sieve-of-eratosthenes,sieve,C,Sieve Of Eratosthenes,Sieve,有人能告诉我为什么我的程序输出所有的素数直到输入的n,并且只输出数字n+2(无论它是素数还是非素数)?有时,如果为素数,则输出为2,3,5,7,11,12,例如,对于输入n=10,输出为2,3,5,7,11,12 这是我的密码: /*Write a program that reads in a number n between 1 and 100,000 and then lists all the prime numbers between 1 and n inclusive.*/ #in

有人能告诉我为什么我的程序输出所有的素数直到输入的
n
,并且只输出数字
n+2
(无论它是素数还是非素数)?有时,如果为素数,则输出为
2,3,5,7,11,12
,例如,对于输入
n=10
,输出为
2,3,5,7,11,12

这是我的密码:

/*Write a program that reads in a number n between 1 and 100,000 and then lists all the prime numbers between 1 and n inclusive.*/

#include

#define LIMIT 100000 /*size of integers array*/
#define PRIMES 100000 /*size of primes array*/

int main(){
    int i,j,numbers[LIMIT];
    int primes[PRIMES];
    int n, count;
    count = 0;

    /*Read in an upper limit, n*/
    printf("Please enter a value for n: ");
    if (scanf("%d", &n) !=1) {
        printf("Sorry, cannot read n.\n");
        return 1;
    }

    /*fill the array with natural numbers*/
    for (i=0;i<=n;i++){
        numbers[i]=i+2;
    }

    /*sieve the non-primes*/
    for (i=0;i<=n;i++){
        if (numbers[i]!=-1){
            for (j=2*numbers[i]-2;j<n;j+=numbers[i])
                numbers[j]=-1;
        }
    }

    /*transfer the primes to their own array*/
    j = 0;
    for (i=0;i<=n&&j<PRIMES;i++)
        if (numbers[i]!=-1) {
            primes[j++] = numbers[i];
            count = count + 1; }

    /*print*/
    for (i=0;i<count;i++)
        printf("%d\n",primes[i]);

    return 0;
}
/*编写一个程序,读入1到100000之间的数字n,然后列出1到n之间的所有素数*/
#包括
#定义整数数组的限制100000/*大小*/
#定义素数100000/*素数数组的大小*/
int main(){
int i,j,数字[限值];
整数素数[素数];
int n,计数;
计数=0;
/*读入一个上限,n*/
printf(“请输入n:”的值);
如果(scanf(“%d”,&n)!=1){
printf(“对不起,无法读取n.\n”);
返回1;
}
/*用自然数填充数组*/

对于(i=0;i你总是把n+1和n+2放在数字数组中

for (i=0;i<=n;i++){
    numbers[i]=i+2;
}

for(i=0;我会遇到堆栈溢出问题!听起来您可能需要学习如何使用a来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它偏离预期的位置。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:。它有偏差(
number[i]=i+2;
)。谢谢,我尝试将该循环更改为两者:对于(j=2*numbers[i]-2;jI,我用固定版本的代码编辑了我的响应。主要问题是迭代到n,而不是直到n-2。
for (i=0;i<=n;i++){
    if (numbers[i]!=-1){
        for (j=2*numbers[i]-2;j<n;j+=numbers[i])
            numbers[j]=-1;
    }
}
#define MAX_SIZE 100000 /*size of integers array*/

int main() {
    unsigned int i; 
    unsigned int j;
    unsigned int max_filled_index;
    unsigned int numbers[MAX_SIZE];
    unsigned int primes[MAX_SIZE];
    unsigned int num_to_sieve;
    unsigned int prime_count = 0;

    /*Read in an upper limit, n*/
    printf("Please enter a value for n: ");
    if (scanf("%d", &num_to_sieve) != 1) {
        printf("Sorry, cannot read n.\n");
        return 1;
    }

    max_filled_index = num_to_sieve - 2;
    /*fill the array with natural numbers*/
    for (i = 0; i <= max_filled_index; i++) {
        numbers[i] = i + 2;
    }


    /*sieve the non-primes*/
    for (i = 0; i <= max_filled_index; i++) {
        if (numbers[i] != 0) {
            for (j = 2 * numbers[i] - 2; j <= max_filled_index; j += numbers[i]) {
                numbers[j] = 0;
            }
        }
    }

    /*transfer the primes to their own array*/
    for (i = 0; i <= max_filled_index && prime_count < MAX_SIZE; i++)
        if (numbers[i] != 0) {
            primes[prime_count] = numbers[i];
            prime_count++;
        }

    /*print*/
    for (i = 0; i < prime_count; i++)
        printf("%d\n", primes[i]);

    return 0;
}