📄 sieve2.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
// We will compute all primes less than the value specified on the
// command line, or, if no argument, all primes less than 100.
int max = 100; // Assign a default value
max =atoi(argv[1]);
// Create an array that specifies whether each number is prime or not.
int maxhalf=(max+1)/2;
char * isprime = ( char*)malloc(maxhalf+1); //only save odd
int ct=0;
int i;
// Assume that all numbers are primes, until proven otherwise.
for( i = 0; i <= maxhalf; i++)
{
isprime[i] = 1;
// ct++;
}
// However, we know that 0 and 1 are not primes. Make a note of it.
isprime[0] = 0; //1
isprime[1] = 1; //3
// To compute all primes less than max, we need to rule out
// multiples of all integers less than the square root of max.
int n = (int) ceil(sqrt(max)); // See java.lang.Math class
// Now, for each integer i from 0 to n:
// If i is a prime, then none of its multiples are primes,
// so indicate this in the array. If i is not a prime, then
// its multiples have already been ruled out by one of the
// prime factors of i, so we can skip this case.
for( i = 3; i <= n; i+=2) {
if (isprime[(i-1)/2]) //除法指令不算慢 // If i is a prime,
for(int j = 3*i; j <= max; j = j +i +i) // loop through multiples,
{
isprime[(j-1)/2] = 0; // they are not prime.
// ct++;
}
}
// Now go look for the largest prime:
int largest=2;
if(max <=2)
{
largest=2;
}
else if((max%2==1)&&(isprime[(max-1)/2]))
{
largest=max;
}
else
{
for(largest = max-1-(max %2); !isprime[(largest-1)/2]; largest-=2)
{
// ct++; // empty loop body
}
}
// Output the result
printf("The largest prime less than or equal to %d is %d, cycle time:%d\n" ,max, largest,ct);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -