Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Множества_Лекция_3.doc
Скачиваний:
8
Добавлен:
22.02.2015
Размер:
147 Кб
Скачать

Void print (ofstream &fout, int a[ ], int n, unsigned int b)

{unsigned int m; int i, t;

int B[L];

bool p=true;

i=0; m=1; t=0;

for (i=0; i<n && p; i++)

{if (b&m) //не нуль

{B[t]=a[i]; t++;

if (!prost(a[i])){p=false;}

}

m<<=1;

}

if (p)

{for (i=0;i<t;i++)

fout<<setw(6)<<B[i];

fout<<endl;

}

}

// проверка числа на простоту

bool prost (int a)

{int d,q;

bool p;

a=abs(a);

p=(a==2) || (a%2!=0);

if (p)

{d=3; q=int( sqrt (double(a)));

while (d<=q && a%d !=0)

d=d+2; //d+=2;

p=d>q;

}

return p;

}

danN_el.txt

123 13 5 7 43 17

29 11 33 41

rezNK_el.txt

Данное множество:

123 13 5 7 43 17 29 11 33 41

5- элементные подмножества простых чисел:

13 5 7 43 17

13 5 7 43 29

13 5 7 17 29

13 5 43 17 29

13 7 43 17 29

5 7 43 17 29

13 5 7 43 11

13 5 7 17 11

13 5 43 17 11

13 7 43 17 11

5 7 43 17 11

13 5 7 29 11

13 5 43 29 11

13 7 43 29 11

5 7 43 29 11

13 5 17 29 11

13 7 17 29 11

5 7 17 29 11

13 43 17 29 11

5 43 17 29 11

7 43 17 29 11

13 5 7 43 41

13 5 7 17 41

13 5 43 17 41

13 7 43 17 41

5 7 43 17 41

13 5 7 29 41

13 5 43 29 41

13 7 43 29 41

5 7 43 29 41

13 5 17 29 41

13 7 17 29 41

5 7 17 29 41

13 43 17 29 41

5 43 17 29 41

7 43 17 29 41

13 5 7 11 41

13 5 43 11 41

13 7 43 11 41

5 7 43 11 41

13 5 17 11 41

13 7 17 11 41

5 7 17 11 41

13 43 17 11 41

5 43 17 11 41

7 43 17 11 41

13 5 29 11 41

13 7 29 11 41

5 7 29 11 41

13 43 29 11 41

5 43 29 11 41

7 43 29 11 41

13 17 29 11 41

5 17 29 11 41

7 17 29 11 41

43 17 29 11 41

Данное множество:

123 13 5 7 43 17 29 11 33 41

8- элементные подмножества простых чисел:

13 5 7 43 17 29 11 41

Замечание. Сформировать новую битовую строку из k единиц можно с помощью следующих операторов:

s=b & (– int(b));

r=s + b;

b=r | (((b^r)>>2) / s);

где b- предыдущая битовая строка , s,r –переменные.

unsigned int x, s,r;

Пример 2. Решето Эратосфена.

Используя алгоритм “Решето атосфена” записать в файл все простые числа, не превышающие заданного N.

Решето представляет битовую строку для чисел от 0 до N. Сами числа не хранятся. Во все биты строки (кроме 0-го и 1-го,где -0) записываются 1. Выбирается самое маленькое число, из решета удаляются все кратные ему числа (их биты обнуляются), само число помещается в файл.Таким образом из решета удаляются все числа, не являющиеся простыми, остаются единичными только биты, соответствующие простым числам, а сами числа собираются в файле.

Для заданного числа n строится битовая строка s в виде массива из q элементов типа unsigned int (32 бита).

//Resh1.cpp

#include <iostream>

#include <fstream>

#include <iomanip>

using namespace std;

//Решето Эратосфена

const int n=1000; //N

const int q=(n>>5)+1; // это равно (n/32+1), но быстрее!

ofstream fout;

unsigned int u(unsigned int t)

//элемент из s c 1 в бите для t

{return 1<<(t&31);} //=(1<<(t%32);

unsigned int w(unsigned int t)

//номер элемента s с битом для t

{return t>>5;} // = t/32;