- •Void f1 (int a[], int n, unsigned int b)
- •Void f2 (int а[ ], int n, unsigned char b [ ] )
- •Ifstream fin;
- •Void print (ofstream &fout, int a[], int n, unsigned int b);
- •Int main ()
- •Void print (ofstream &fout, int a[ ], int n, unsigned int b)
- •Int main ()
- •Задание на тему «Массивы. Генерация подмножеств.»
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;
