Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cmath>
- using namespace std;
- struct node
- {
- int data;
- node *next;
- };
- bool empty(node *top)
- {
- return top == NULL;
- }
- void push(node *&top, int x)
- {
- node *p=new node;
- p->data = x;
- p->next = top;
- top = p;
- }
- node* create_list(ifstream&f)
- {
- int n,x;
- f >> n;
- node *top = NULL;
- for (int i = 0; i < n; i++)
- {
- f >> x;
- push(top, x);
- }
- return top;
- }
- void show(node *top)
- {
- node *p = top;
- while (p)
- {
- cout << p->data << ' ';
- p = p->next;
- }
- cout << endl;
- }
- node* find_pr_info(node *top, int x)
- {
- node *p = top;
- if (top->data == x)
- return NULL;
- else
- {
- while ((p->next)->data != x && p)
- p = p->next;
- return p;
- }
- }
- void del_info(node *&top, int x)
- {
- node *p = top;
- if (top->data == x)
- top = p->next;
- else
- {
- while ((p->next)->data != x)
- p = p->next;
- p->next = (p->next)->next;
- }
- }
- void sort(node* &top)
- {
- int x;
- node* p = top, *q;
- while (p&&p->next)
- {
- q = p->next;
- while (q)
- {
- if (p->data >= q->data)
- {
- x = p->data;
- p->data = q->data;
- q->data = x;
- }
- q = q->next;
- }
- p = p->next;
- }
- }
- node** create_massiv_lists(ifstream&f,int n)
- {
- node **mas = new node*[n];
- for (int i = 0; i < n; i++)
- mas[i] = create_list(f);
- return mas;
- }
- void show_mas(node **mas,int n)
- {
- for (int i = 0; i < n; i++)
- {
- show(mas[i]);
- }
- }
- node* find_address(node* top, int x)
- {
- node* p;
- p = top;
- while (p && (p->data) != x)
- p = p->next;
- return p;
- }
- bool is_member(node* top, int data)
- {
- if (find_address(top, data))
- return true;
- else return false;
- }
- node* list_in_set(node *top)
- {
- node *p=top,*set=NULL;
- while(p)
- {
- if (!is_member(set, p->data))
- push(set, p->data);
- p = p->next;
- }
- sort(set);
- return set;
- }
- node** lists_in_sets(node **mas,int n)
- {
- node **sets = new node*[n];
- for (int i = 0; i < n; i++)
- {
- sets[i] = list_in_set(mas[i]);
- sort(sets[i]);
- }
- return sets;
- }
- bool prime(int n)
- {
- int i;
- bool k = true;
- for (i = 2; i <= int(pow(n, 1.0 / 2)); i++)
- if (n%i == 0)
- return false;
- if (k == true)
- return 1;
- else
- return 0;
- }
- bool twins(node *top)
- {
- node *p = top;
- bool t = 0;
- while (p && !t)
- {
- if (prime(p->data) && find_address(top, p->data - 2) && find_address(top, p->data + 2) && prime(p->data - 2) && prime(p->data + 2))
- t = 1;
- p = p->next;
- }
- return t;
- }
- int max_mas(node **mas,int n)
- {
- int max = mas[0]->data;
- for (int i = 0; i < n; i++)
- {
- node *p = mas[i];
- while (p)
- {
- if (abs(p -> data) > max)
- max = abs(p->data);
- p = p->next;
- }
- }
- return max;
- }
- node* stepeni_2(int max)
- {
- node *list = NULL;
- int i = 2,k=1;
- push(list, 1);
- while (i <= max)
- {
- push(list, i);
- i = pow(2, k + 1);
- k++;
- }
- sort(list);
- return list;
- }
- node* del(int x)
- {
- node *top = NULL;
- for (int i = 2; i <= x/2+1; i++)
- if (x%i==0)
- push(top, i);
- sort(top);
- return top;
- }
- int size(node *top)
- {
- int n = 0;
- node *p = top;
- while (p)
- {
- n++;
- p = p->next;
- }
- return n;
- }
- bool list_prime(node *top)
- {
- node *p = top;
- bool t = 1;
- while (p&&t)
- {
- if (size(del(p->data)) != 2)
- t = 0;
- else
- {
- if (!prime(del(p->data)->data) && !prime((del(p->data)->next)->data))
- t = 0;
- else t = 1;
- }
- p = p -> next;
- }
- return t;
- }
- node* copy(node *set)
- {
- node *cset = NULL, *p = set;
- while (p)
- {
- push(cset, p->data);
- p = p->next;
- }
- return cset;
- }
- node* unio(node *set1, node *set2)
- {
- node* set3;
- set3 = copy(set1);
- while (set2)
- {
- if (!is_member(set3, set2->data))
- push(set3, set2->data);
- set2 = set2->next;
- }
- sort(set3);
- return set3;
- }
- node* inter(node *set1, node *set2)
- {
- node* set3 = NULL;
- while (set2)
- {
- if (is_member(set1, set2->data))
- push(set3, set2->data);
- set2 = set2->next;
- }
- sort(set3);
- return set3;
- }
- bool func11(node **mas,int n)
- {
- bool t = 0;
- for (int i = 0; i < n&&!t; i++)
- {
- bool q = 0;
- node *p = mas[i], *p1=NULL, *p2=NULL;
- while (p && !q)
- {
- if (prime(p->data))
- {
- p1 = p;
- q = 1;
- }
- p = p->next;
- }
- if (q)
- {
- bool l = 0;
- while (p&&!l)
- {
- if (prime(p->data))
- {
- p2 = p;
- l = 1;
- }
- p = p->next;
- }
- if (l)
- if(abs(p1->data - p2->data) <= 2)
- t = 1;
- }
- }
- return t;
- }
- bool func16(node **mas, int n)
- {
- bool t = 0;
- for (int i = 0; i < n&&!t; i++)
- if(list_prime(mas[i]))
- t = 1;
- return t;
- }
- int main()
- {
- ifstream in("input.txt");
- node **mas,*n1=NULL,*n2=NULL;
- int n;
- in >> n;
- mas = create_massiv_lists(in, n);
- mas = lists_in_sets(mas, n);
- int maximum_in_mas = max_mas(mas,n);
- for (int i = 0; i < n; i++)
- {
- if (twins(mas[i]))
- n1 = inter(n1, mas[i]);
- else
- n1 = stepeni_2(maximum_in_mas);
- }
- show(n1);
- if (func16(mas, n))
- {
- for (int i = 0; i < n; i++)
- if (list_prime(mas[i]))
- n2 = unio(n2, mas[i]);
- }
- else
- {
- int k;
- if (size(mas[0]) > size(mas[1]))
- k = size(mas[1]);
- else k = size(mas[0]);
- node *p = mas[0];
- node *q = mas[1];
- for (int i = 0; i < k; i=i+2)
- {
- push(n2, p->data);
- push(n2, q->data);
- p = p->next;
- q = q->next;
- }
- }
- show(n2);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement