Top.Mail.Ru
Ответы

Помогите с решетом эратосфена

Учусь по книге страуструпа, было такое задание. Решил не гуглить, а сделать сам, не вышло ( почему-то решето работает только где-то о 50, а дальше просто не хочет. Подскажите где ошибка пожалуйста. КОД
:#include
#include
#include
using namespace std;
int main(){
int sieve [100] = {};
for (int w=0; w<100; w++)
sieve[w]=w;
for(int q=2; q<=10; q++)
{
for(int r=q; r<=100; r+=r)
sieve[r] =0;
}
for (int e=0; e<100; e++) {
cout << sieve[e] << "\n";
}
}

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
6лет

for(int q = 2; q <= 50; ++q) { // q * 2 <= 100
if (sieve[q] == 0) { continue; }
for(int r = q * 2; r <= 100; r += q) { sieve[r] = 0; }
}

Аватар пользователя
Мыслитель
6лет

Вот тебе рабочий эратосфен на сях, изучай.
#include < stdio.h >
#include < stdlib.h >
#include < math.h >

#define PRINT

void eratosthenes(unsigned number)
{
unsigned total = (number >> 1 ) + (number & 1);
if(total)
{
unsigned array[total];
array[0] = 2;
for(unsigned offset = 1,value = array[0]+1 ; offset < total;++offset,value+=2)
array[offset] = value;
unsigned max_divisors = (unsigned)sqrt(number)+1;
for(unsigned current_value = array[0]+1,offset = 0;current_value < max_divisors;current_value = array[++offset])
{
if(!current_value)
continue;
for(unsigned step = (current_value*current_value)>>1;step<total;step+=current_value)
array[step] = 0;
}
#ifdef PRINT
for(unsigned i = 0; i < total;++i)
if(array[i])
printf("%u,",array[i]);
#endif
}
}
int main()
{
eratosthenes(1000);
return 0;
}

Аватар пользователя
Просветленный
6лет

Я, пожалуй, тоже скину свой код. Надеюсь, хватит первых 240 миллионов чисел, чтобы просéять их через решетó? Массивы х [240000000] и р [14000000] глобальные (чтобы не писáло всякой ерунды типа segmentation fault !) и статические. Первый- логический: х [k]=true, если число k простое и false, если наоборот. В итоге работы будет p[1]=2, p[2]=3, p[3]=5 и так далее, a m- количество простых чисел ≤n.

#include "stdio.h"

bool x[240000000]; int p[14000000];

int main()

{ int k,l,m,n; printf ("n=?\b"); scanf ("%d", &n); x[1]=false; for (k=2; k <=n; k++) x[k]=true; for (k=2; k <= n/2; k++) if (x[k]==true) { l=n/k; for (m=2; m<=l; m++) x[m*k]=false; } m=0; for (k=2; k<=n; k++) if ( x[k]==true ) { m+=1; p[m]=k; }

//дальше можно, например, вывести полученный массив:

for (k=1; k<=m; k++) printf("%d %d", k, p[k]); }

Аватар пользователя
Искусственный Интеллект
6лет

for(int r=q; r<=100; r+=r)

Почему ты на каждом шаге умножаешь r на 2 о_О?