Нахождение простых чисел

Ноябрь 22nd, 2011 § 0 comments

Достаточно простая задача на нахождение простых чисел, приведу два исходника на Си / С++ для решение такой задачи. Используем знаменитый метод “Решето Эратосфена”.

Код на Си


long nn = 10000;
int mas[nn];

memset(mas, 0, sizeof(mas));

mas[0] = 1;
mas[1] = 1;
for (int i = 2; i < nn; i++)
 if (!mas[i])
 {
 for (int j = i * 2; j < nn; j += i)
 mas[j] = 1;
 }


Код на c++


#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
 std::vector<unsigned int> simples;
 unsigned int n = 120;
 for (unsigned int i = 2; i <= n; i++)
 simples.insert(simples.end(), i);

 for (std::vector<unsigned int>::iterator i = simples.begin(); i != simples.end(); i++)
 {
 int p = *i;
 for (unsigned int j = 2*p; j <= n; j += p)//Каждый шаг прибавляем по p, начиная от 2p. Получается 2p, 3p, etc.
 {
 std::vector<unsigned int>::iterator item = std::find(simples.begin(), simples.end(), j);
 if (item == simples.end()) continue;
 if (j%p == 0)
 simples.erase(item);
 }
 std::cout<<p<<std::endl;
 }
 return 0;
}

Помимо нахождения методом Эратосфена, существует еще способ, который базируется на утверждении что делить N не превосходит корень из делимого.  Доказывать это утверждение здесь не будем, если есть желание можете посмотреть его самостоятельно. Код на С++ будет примерно такой.


#include <iostream>
#include <math.h>
using namespace std;

int main()
{
 int min,max;
 double t;
 cin>>min;
 cin>>max;
for(;min<max;min++)
{
 bool isPrime = true;
 t=ceil(sqrt((double)min));
 for(int j=2;j<=t && isPrime;j++)
 {
 if(min % j ==0)
 isPrime=false;
 }
 if(isPrime)
 cout<<min<<" ";

}
return 0;
}

Tagged

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн