Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




13 5 7 43 17 29 11 41

123 13 5 7 43 17 29 11 33 41

43 17 29 11 41

7 17 29 11 41

5 17 29 11 41

13 17 29 11 41

7 43 29 11 41

5 43 29 11 41

13 43 29 11 41

5 7 29 11 41

13 7 29 11 41

13 5 29 11 41

7 43 17 11 41

5 43 17 11 41

13 43 17 11 41

5 7 17 11 41

13 7 17 11 41

13 5 17 11 41

5 7 43 11 41

13 7 43 11 41

13 5 43 11 41

13 5 7 11 41

7 43 17 29 41

5 43 17 29 41

13 43 17 29 41

5 7 17 29 41

13 7 17 29 41

13 5 17 29 41

5 7 43 29 41

13 7 43 29 41

13 5 43 29 41

13 5 7 29 41

5 7 43 17 41

13 7 43 17 41

13 5 43 17 41

13 5 7 17 41

13 5 7 43 41

7 43 17 29 11

5 43 17 29 11

13 43 17 29 11

5 7 17 29 11

13 7 17 29 11

13 5 17 29 11

5 7 43 29 11

13 7 43 29 11

13 5 43 29 11

13 5 7 29 11

5 7 43 17 11

13 7 43 17 11

13 5 43 17 11

13 5 7 17 11

13 5 7 43 11

5 7 43 17 29

13 7 43 17 29

13 5 43 17 29

13 5 7 17 29

13 5 7 43 29

13 5 7 43 17

123 13 5 7 43 17 29 11 33 41

29 11 33 41

123 13 5 7 43 17

If (p)

If (p)

Do

Рассмотрим алгоритм генерации k-элементных подмножеств множества из n элементов, т.е. последовательного формирования возрастающих по значению битовых строк с k единицами.

Пример 1.

И т.д.

..................

.... 000... 1000111

.... 000... 0111100

..................

.... 000.... 100010

.... 000....100001

....000....100000

....000.... 011111

................

....000.... 000011

....000.... 000010

....000....000001

..........

}

В этом алгоритме последовательно получаемые подмножества могут сильно отличаться друг от друга: после (n-1)-элементного множества (которому соответствует число 01111…..1) идёт одноэлементное множество(отвечающее числу 1000……0). Это часто неудобно.

//Nelset.cpp k-элементные подмножества,

// маска - слово

 

#include <iostream>

#include <fstream>

#include <iomanip>

#include <math.h>

using namespace std;

//Дана совокупность не более n целых чисел

//и число k. Выбрать все подмножества из k

// простых чисел.

//Все подмножества (k – элементные) записать в файл.

const int L=32; // n=31 элемент +1

ifstream fin;

ofstream fout;

// прототипы функций

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

bool prost (int a);

int main ()

{int i;

unsigned int b,n,k, nn;

int a[L];

fin.open("danN_el.txt");

if (fin.fail()){cout<<"error open danN.txt\n"; return(1);}

fout.open("rezNK_el.txt");

if (fout.fail()){cout<<"error open rezNK.txt\n";return(1);}

cout<<"k--> "; //кол-во эл-ов в подмножестве

cin>>k;

i=0;

fout<<"Данное множество: "<<endl;

while (fin>>a[i])

{fout<<setw(6)<<a[i];

i++;

if ((i%10)==0)fout<<endl;

}

fout<<endl;

fout<<k<<"- элементные подмножества простых чисел: "<<endl;

n=i; //cчитано n элементов: 0-ой, 1-й,..., (n-1)-ый

//выделение подмножеств, b – битовая строка (маска)

b=(1<<k)-1; //в маске k единиц 000...011...1 (1-ое подмножество)

nn=1<<n; //здесь единица n-го разряда

{print (fout, a, n, b); //обработка 1-го подмножества

//получение следующей маски из n единиц

unsigned int m;

m=1;

while ((b&m)==0) // пропуск крайних нулей

{ m=m<<1;}

int bb=0; //счетчик единиц

while ((b&m)!=0) //пока не нуль, обработка единиц

{ bb++; //подсчёт единиц

b=b^m; //обнуление единиц

m=m<<1;

}

b=b|m; // первый 0 после единиц заменяем на 1

//установка bb-1 единиц в конец маски

b=b | ((1<<(bb-1))-1); //новая маска

}

while (b<nn);

fin.close(); fout.close();

return 0;

}

// запись в файл подмножеств из k простых элементов

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;

}

{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);

{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

rezNK_el.txt

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

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

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

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

 

 

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

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

r=s + b;

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

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

unsigned int x, s,r;

 

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




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 358; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.