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;
}