我试图找出如何使用埃拉托色尼的筛子从1-300找到素数。 我无法计算出来,所以任何帮助将是不错! 顺便说一句,即时通讯新的节目,所以如果你能保持它的简单,这将是最好的下面是我的代码(到目前为止)
#include <stdio.h>
#include <simpio.h>
#include <genlib.h>
#include <math.h>
#define max 301
main()
{
bool is_prime[max];
int i, int1, j, n;
int1=sqrt(max);
for(n=0; n<=max; n++);
{
is_prime[n]=TRUE; //set everything to prime
}
is_prime[0]=FALSE; //false = NOT prime
is_prime[1]=FALSE;
for(i=2; i<int1; i++); //multiply starting from 2 end at 17
{
for(j=i; j<=(max/i); j++); //number being multiplied by
{
n=(j*i);
is_prime[n]==FALSE; //all multiples of i are false
}
}
if (is_prime[n]=TRUE); //print all prime numbers
{
printf("%d", n);
}
getchar();
}
你可以看看这里的落实。
筛实现:
bool arr[1000001];
int main()
{
arr[0]=arr[1]=1;
for(int i=4;i<1000001;i+=2)
arr[i]=1;
for(int i=3;i<1000001;i+=2)
{
if(!arr[i])
for(int j=2;i*j<1000001;j++)
{
arr[i*j]=1;
}
}
return 0;
}
并且有书面素数一个博客链接 。
class Program {
static void Main(string[] args) {
const byte disqualified = 1;
const byte isprime = 2;
int max = 300;
byte[] numbers = new byte[max + 1];
for (int outerIndex = 2; outerIndex < max + 1; outerIndex++) {
if (numbers[outerIndex] != disqualified) {
numbers[outerIndex] = isprime;
for (int innerIndex = outerIndex * 2; innerIndex < max + 1; innerIndex += outerIndex) {
numbers[innerIndex] = disqualified;
}
}
}
for (int i = 2; i < numbers.Length; i++) {
if (numbers[i] == isprime) {
Console.WriteLine("{0} is a prime number, thanks E my toga clad nerd buddy", i);
}
}
Console.ReadKey();
}
}
是的,C#示例 - 但足够附近转换
结果是:
是除了它已经被指出不恰当的分号。 例如,当块如以下预期不执行
for(n=0; n<=max; n++);
{
....
}
解决这样的
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#define max 301
int main(){
bool is_prime[max];
int i, int1, j, n;
int1=sqrt(max);//17
for(n=0; n<max; ++n){
is_prime[n]=true;
}
is_prime[0]=false; //false = NOT prime
is_prime[1]=false;
for(i=2; i<int1; i++){
if(is_prime[i])
for(j=i+i; j<max; j+=i){
is_prime[j]=false;
}
}
for(n=2;n<max;++n){
if(is_prime[n]==true)
printf("%d ", n);
}
return 0;
}
#include <stdio.h>
#include <math.h>
#define max 300+1
int main(void){
static is_prime[max]={0};
int i, int1, n;
int *p;
int1=sqrt(max);
is_prime[2] = 1;
p = &is_prime[3];
for(n=3; n<max; n+=2, p+=2)
*p = 1;
for(n=3; n<int1; n+=2)
if(is_prime[n])
for(i=n+n; i<max; i+=n)
is_prime[i] = 0;
for(n=2;n<max;++n)
if(is_prime[n])
printf("%d ", n);
return 0;
}
下面是C ++中的示例实现:
void sieve_of_eratosthenes(int n)
{
bool *sieve = new bool[n+1];
// Initialize
sieve[0]=false;
sieve[1]=false;
sieve[2]=true;
for(int i=3;i<n+1;++i)
sieve[i]=true;
// Actual sieve
for(int i=1; i<n+1; ++i)
if(sieve[i]==true)
for(int j=2;j*i<n+1;++j)
sieve[j*i]=false;
// Output
cout << "Prime numbers are: " <<endl;
for(int i=0;i<n+1;++i)
if (sieve[i])
cout << i <<endl;
delete [] sieve;
}
int main()
{
int n = 70;
sieve_of_eratosthenes(n);
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class exp {
private int size;
private boolean[] arr;
public exp(int a){
size = a;
arr = new boolean[size];
}
public void initialize(){
for(int i=2;i<size;++i)
arr[i] = true;
arr[0] = arr[1] = false;
}
public void precompute(){
int i=2;
while(i<size){
if(arr[i]){
for(int j=2*i; j<size; j=j+i)
arr[j] = false;
}
i++;
}
}
public String printX(int as){
int counter = 0;
String ans="",b = " ";
for(int i=0; i<size ; ++i){
if(arr[i]){
ans += String.valueOf(i) + b;
counter++;
}
if(counter == as)
break;
}
return ans;
}
public static void main(String[] args) throws NumberFormatException, IOException {
long a = System.currentTimeMillis();
exp e = new exp(50000);
e.initialize();
e.precompute();
long b = System.currentTimeMillis();
//System.out.println(b-a);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int N;
for(int i=0;i<t;++i){
N = Integer.parseInt(br.readLine());
if(N == 1)
System.out.println("1");
else
System.out.println(e.printX(N));
}
}
}
为了从1-300找到素数,你必须使用一个名为埃拉托色尼筛技术,它是要找到一个给定的范围内质数列表中选择最有效的方式。
这里是代码:
#include <bits/stdc++.h>
using namespace std;
const int SIZE=100010;
int status[SIZE]={1};
int sieve(){
for(int i=0;i<=SIZE;i++)
status[i]=1;
for(int i=2;i<=SIZE;i++){
if(status[i]==1){
for(int j=2*i;j<=SIZE;j+=i){
status[j]=0;
}
}
}
}
int main(){
sieve();
//check from 2 to 300 which one is prime
for(int i=2;i<300;i++){
if(status[i]==1)
printf("%d ",i);
}
}