#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define STRING_SIZE 80
#define arrsize(x) (sizeof(x)/sizeof((x)[0]))
//
int find(int a, int *b, int size) {
for (int i = size; i != -1; i--){
if (a == b[i]) return i;
}
return -1; // not found
}
//
int randSet(int **set) {
int size = (rand() % 10 + 1);
*set = (int*) malloc(size*sizeof(int));
for (int i = 0; i != size; i++){
int num = rand() % 10 + 1;
if (find(num, *set, i) != -1) {
i--;
continue;
}
(*set)[i] = num;
}
return size;
}
//
int copy(int *a, int sizea, int *b) {
if (a == NULL || b == NULL) return -1;
for (int i = 0; i != sizea; i++){
b[i] = a[i];
}
return 0;
}
//
char* setToStr(int *b, int size) {
if (b == NULL) return NULL;
char *s = (char*) malloc(STRING_SIZE*sizeof(char)); // unsafe
s[0] = '[';
for (int i = 0; i != size; i++){
if (i != 0){
if (sprintf(s, "%s, %d", s, b[i]) <= 0) return NULL;
continue;
}
if (sprintf(s, "%s%d", s, b[i]) <= 0) return NULL;
}
if (sprintf(s, "%s]", s) <= 0) return NULL;
return s;
}
//
int intersect(int *a, int sizea, int *b, int sizeb, int **ret) {
if (a == NULL || b == NULL) return -1;
int* set = (int*) malloc(sizea*sizeof(int));
int count = 0;
for (int i = 0; i != sizea; i++){
if (find(a[i], b, sizeb) >= 0){
set[count] = a[i];
count++;
}
}
*ret = (int*) malloc(count*sizeof(int));
if (copy(set, count, *ret)) return -1;
delete(set);
return count;
}
int unite(int *a, int sizea, int *b, int sizeb, int **ret) {
if (a == NULL || b == NULL) return -1;
int* set = (int*) malloc((sizea+sizeb)*sizeof(int));
int count = sizea;
for (int i = 0; i != sizea; i++) {
set[i] = a[i];
}
for (int i = 0; i != sizeb; i++) {
if (find(b[i], a, sizeb) < 0){
set[count] = b[i];
count++;
}
}
*ret = (int*) malloc(count*sizeof(int));
if (copy(set, count, *ret)) return -1;
delete(set);
return count;
}
int diference(int *a, int sizea, int *b, int sizeb, int **ret) {
if (a == NULL || b == NULL) return -1;
int* set = (int*) malloc(sizea*sizeof(int));
int count = 0;
for (int i = 0; i != sizea; i++) {
if (find(a[i], b, sizeb) < 0){
set[count] = a[i];
count++;
}
}
*ret = (int*) malloc(count*sizeof(int));
if (copy(set, count, *ret)) return -1;
delete(set);
return count;
}
bool equal(int *a, int sizea, int *b, int sizeb) {
if (a == NULL || b == NULL) return false;
if (sizea != sizeb) return false;
for (int i = 0; i != sizea; i++) {
if (find(a[i], b, sizeb) < 0) return false;
}
for (int i = 0; i != sizeb; i++) {
if (find(b[i], a, sizea) < 0) return false;
}
return true;
}
int main() {
// main init
srand(time(NULL));
// sets
int *setA, *setB, *setC;
int sizeA = randSet(&setA);
int sizeB = randSet(&setB);
int sizeC = randSet(&setC);
printf("Множества:\nA = %s\nB = %s\nC = %s\n\n", setToStr(setA, sizeA), setToStr(setB, sizeB), setToStr(setC, sizeC));
int *setX, *setY, *setZ, *set1, *set2;
int sizeX, sizeY, sizeZ, size1, size2;
sizeX = intersect(setB, sizeB, setC, sizeC, &setX);
size1 = diference(setA, sizeA, setX, sizeX, &set1);
printf("A\\(BnC) = %s\n", setToStr(set1, size1));
sizeX = diference(setA, sizeA, setB, sizeB, &setX);
sizeY = diference(setA, sizeA, setC, sizeC, &setY);
size2 = intersect(setX, sizeX, setY, sizeY, &set2);
printf("(A\\B)n(A\\C) = %s\n", setToStr(set2, size2));
sizeX = unite(setX, sizeX, setY, sizeY, &setX);
printf("A\\(BnC) = (A\\B)u(A\\C) %s\n", (equal(set1, size1, setX, sizeX) ? "истина" : "ложь"));
sizeX = unite(setB, sizeB, setC, sizeC, &setX);
size1 = intersect(setA, sizeA, setX, sizeX, &set1);
sizeX = intersect(setA, sizeA, setB, sizeB, &setX);
sizeY = intersect(setA, sizeA, setC, sizeC, &setY);
size2 = unite(setX, sizeX, setY, sizeY, &set2);
printf("An(BuC) = (AnB)u(AnC) %s\n", (equal(set1, size1, set2, size2) ? "истина" : "ложь"));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4gIAojaW5jbHVkZSA8c3RkbGliLmg+IAojaW5jbHVkZSA8dGltZS5oPiAgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBTVFJJTkdfU0laRSA4MCAKI2RlZmluZSBhcnJzaXplKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCgovLwppbnQgZmluZChpbnQgYSwgaW50ICpiLCBpbnQgc2l6ZSkgeyAKCWZvciAoaW50IGkgPSBzaXplOyBpICE9IC0xOyBpLS0pewoJCWlmIChhID09IGJbaV0pIHJldHVybiBpOwoJfQoJcmV0dXJuIC0xOyAvLyBub3QgZm91bmQKfQoKLy8KaW50IHJhbmRTZXQoaW50ICoqc2V0KSB7CglpbnQgc2l6ZSA9IChyYW5kKCkgJSAxMCArIDEpOwoJKnNldCA9IChpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7IAoJZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKXsKCQlpbnQgbnVtID0gcmFuZCgpICUgMTAgKyAxOwoJCWlmIChmaW5kKG51bSwgKnNldCwgaSkgIT0gLTEpIHsKCQkJaS0tOwoJCQljb250aW51ZTsKCQl9CgkJKCpzZXQpW2ldID0gbnVtOwoJfSAKCXJldHVybiBzaXplOwp9CgovLwppbnQgY29weShpbnQgKmEsIGludCBzaXplYSwgaW50ICpiKSB7CglpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCkgcmV0dXJuIC0xOwoJZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZWE7IGkrKyl7CgkJYltpXSA9IGFbaV07Cgl9CglyZXR1cm4gMDsKfQoKLy8KY2hhciogc2V0VG9TdHIoaW50ICpiLCBpbnQgc2l6ZSkgewoJaWYgKGIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgljaGFyICpzID0gKGNoYXIqKSBtYWxsb2MoU1RSSU5HX1NJWkUqc2l6ZW9mKGNoYXIpKTsgLy8gdW5zYWZlCglzWzBdID0gJ1snOwoJZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKXsKCQlpZiAoaSAhPSAwKXsKCQkJaWYgKHNwcmludGYocywgIiVzLCAlZCIsIHMsIGJbaV0pIDw9IDApIHJldHVybiBOVUxMOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHNwcmludGYocywgIiVzJWQiLCBzLCBiW2ldKSA8PSAwKSByZXR1cm4gTlVMTDsKCX0KCWlmIChzcHJpbnRmKHMsICIlc10iLCBzKSA8PSAwKSByZXR1cm4gTlVMTDsKCXJldHVybiBzOwp9CgovLwppbnQgaW50ZXJzZWN0KGludCAqYSwgaW50IHNpemVhLCBpbnQgKmIsIGludCBzaXplYiwgaW50ICoqcmV0KSB7CglpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCkgcmV0dXJuIC0xOwoJaW50KiBzZXQgPSAoaW50KikgbWFsbG9jKHNpemVhKnNpemVvZihpbnQpKTsKCWludCBjb3VudCA9IDA7Cglmb3IgKGludCBpID0gMDsgaSAhPSBzaXplYTsgaSsrKXsKCQlpZiAoZmluZChhW2ldLCBiLCBzaXplYikgPj0gMCl7CgkJCXNldFtjb3VudF0gPSBhW2ldOwoJCQljb3VudCsrOwoJCX0KCX0KCSpyZXQgPSAoaW50KikgbWFsbG9jKGNvdW50KnNpemVvZihpbnQpKTsKCWlmIChjb3B5KHNldCwgY291bnQsICpyZXQpKSByZXR1cm4gLTE7CglkZWxldGUoc2V0KTsKCXJldHVybiBjb3VudDsKfQppbnQgdW5pdGUoaW50ICphLCBpbnQgc2l6ZWEsIGludCAqYiwgaW50IHNpemViLCBpbnQgKipyZXQpIHsKCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKSByZXR1cm4gLTE7CglpbnQqIHNldCA9IChpbnQqKSBtYWxsb2MoKHNpemVhK3NpemViKSpzaXplb2YoaW50KSk7CglpbnQgY291bnQgPSBzaXplYTsKCWZvciAoaW50IGkgPSAwOyBpICE9IHNpemVhOyBpKyspIHsKCQlzZXRbaV0gPSBhW2ldOwoJfQoJZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZWI7IGkrKykgewoJCWlmIChmaW5kKGJbaV0sIGEsIHNpemViKSA8IDApewoJCQlzZXRbY291bnRdID0gYltpXTsKCQkJY291bnQrKzsKCQl9Cgl9CgkqcmV0ID0gKGludCopIG1hbGxvYyhjb3VudCpzaXplb2YoaW50KSk7CglpZiAoY29weShzZXQsIGNvdW50LCAqcmV0KSkgcmV0dXJuIC0xOwoJZGVsZXRlKHNldCk7CglyZXR1cm4gY291bnQ7Cn0KaW50IGRpZmVyZW5jZShpbnQgKmEsIGludCBzaXplYSwgaW50ICpiLCBpbnQgc2l6ZWIsIGludCAqKnJldCkgewoJaWYgKGEgPT0gTlVMTCB8fCBiID09IE5VTEwpIHJldHVybiAtMTsKCWludCogc2V0ID0gKGludCopIG1hbGxvYyhzaXplYSpzaXplb2YoaW50KSk7CglpbnQgY291bnQgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgIT0gc2l6ZWE7IGkrKykgewoJCWlmIChmaW5kKGFbaV0sIGIsIHNpemViKSA8IDApewoJCQlzZXRbY291bnRdID0gYVtpXTsKCQkJY291bnQrKzsKCQl9Cgl9CgkqcmV0ID0gKGludCopIG1hbGxvYyhjb3VudCpzaXplb2YoaW50KSk7CglpZiAoY29weShzZXQsIGNvdW50LCAqcmV0KSkgcmV0dXJuIC0xOwoJZGVsZXRlKHNldCk7CglyZXR1cm4gY291bnQ7Cn0KYm9vbCBlcXVhbChpbnQgKmEsIGludCBzaXplYSwgaW50ICpiLCBpbnQgc2l6ZWIpIHsKCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CglpZiAoc2l6ZWEgIT0gc2l6ZWIpIHJldHVybiBmYWxzZTsKCWZvciAoaW50IGkgPSAwOyBpICE9IHNpemVhOyBpKyspIHsKCQlpZiAoZmluZChhW2ldLCBiLCBzaXplYikgPCAwKSByZXR1cm4gZmFsc2U7Cgl9Cglmb3IgKGludCBpID0gMDsgaSAhPSBzaXplYjsgaSsrKSB7CgkJaWYgKGZpbmQoYltpXSwgYSwgc2l6ZWEpIDwgMCkgcmV0dXJuIGZhbHNlOwoJfQoJcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkgewoJLy8gbWFpbiBpbml0CglzcmFuZCh0aW1lKE5VTEwpKTsKCQoJLy8gc2V0cwoJaW50ICpzZXRBLCAqc2V0QiwgKnNldEM7CglpbnQgc2l6ZUEgPSByYW5kU2V0KCZzZXRBKTsKCWludCBzaXplQiA9IHJhbmRTZXQoJnNldEIpOwoJaW50IHNpemVDID0gcmFuZFNldCgmc2V0Qyk7CgkKCXByaW50Zigi0JzQvdC+0LbQtdGB0YLQstCwOlxuQSA9ICVzXG5CID0gJXNcbkMgPSAlc1xuXG4iLCBzZXRUb1N0cihzZXRBLCBzaXplQSksIHNldFRvU3RyKHNldEIsIHNpemVCKSwgc2V0VG9TdHIoc2V0Qywgc2l6ZUMpKTsKCQoJaW50ICpzZXRYLCAqc2V0WSwgKnNldFosICpzZXQxLCAqc2V0MjsKCWludCBzaXplWCwgc2l6ZVksIHNpemVaLCBzaXplMSwgc2l6ZTI7CgkKCXNpemVYID0gaW50ZXJzZWN0KHNldEIsIHNpemVCLCBzZXRDLCBzaXplQywgJnNldFgpOwoJc2l6ZTEgPSBkaWZlcmVuY2Uoc2V0QSwgc2l6ZUEsIHNldFgsIHNpemVYLCAmc2V0MSk7CglwcmludGYoIkFcXChCbkMpID0gJXNcbiIsIHNldFRvU3RyKHNldDEsIHNpemUxKSk7CgkKCXNpemVYID0gZGlmZXJlbmNlKHNldEEsIHNpemVBLCBzZXRCLCBzaXplQiwgJnNldFgpOwoJc2l6ZVkgPSBkaWZlcmVuY2Uoc2V0QSwgc2l6ZUEsIHNldEMsIHNpemVDLCAmc2V0WSk7CglzaXplMiA9IGludGVyc2VjdChzZXRYLCBzaXplWCwgc2V0WSwgc2l6ZVksICZzZXQyKTsKCXByaW50ZigiKEFcXEIpbihBXFxDKSA9ICVzXG4iLCBzZXRUb1N0cihzZXQyLCBzaXplMikpOwoJCglzaXplWCA9IHVuaXRlKHNldFgsIHNpemVYLCBzZXRZLCBzaXplWSwgJnNldFgpOwoJcHJpbnRmKCJBXFwoQm5DKSA9IChBXFxCKXUoQVxcQykgJXNcbiIsIChlcXVhbChzZXQxLCBzaXplMSwgc2V0WCwgc2l6ZVgpID8gItC40YHRgtC40L3QsCIgOiAi0LvQvtC20YwiKSk7CgkKCXNpemVYID0gdW5pdGUoc2V0Qiwgc2l6ZUIsIHNldEMsIHNpemVDLCAmc2V0WCk7CglzaXplMSA9IGludGVyc2VjdChzZXRBLCBzaXplQSwgc2V0WCwgc2l6ZVgsICZzZXQxKTsKCXNpemVYID0gaW50ZXJzZWN0KHNldEEsIHNpemVBLCBzZXRCLCBzaXplQiwgJnNldFgpOwoJc2l6ZVkgPSBpbnRlcnNlY3Qoc2V0QSwgc2l6ZUEsIHNldEMsIHNpemVDLCAmc2V0WSk7CglzaXplMiA9IHVuaXRlKHNldFgsIHNpemVYLCBzZXRZLCBzaXplWSwgJnNldDIpOwoJcHJpbnRmKCJBbihCdUMpID0gKEFuQil1KEFuQykgJXNcbiIsIChlcXVhbChzZXQxLCBzaXplMSwgc2V0Miwgc2l6ZTIpID8gItC40YHRgtC40L3QsCIgOiAi0LvQvtC20YwiKSk7CgkKCXJldHVybiAwOwp9