打印一对集合之间的所有关系

Print all of the relations between a pair of sets

正在寻找可以帮助我解决问题的人。 我需要打印一对集合与用户输入的域和密码域之间的所有关系。

例如,如果输入是 "ab" 和 "abc",则相应的关系列表将是:

0: {}
1: {(a, a), }
2: {(a, b), }
3: {(a, a), (a, b), }
4: {(a, c), }
5: {(a, a), (a, c), }
6: {(a, b), (a, c), }
7: {(a, a), (a, b), (a, c), }
8: {(b, a), }
9: {(a, a), (b, a), }
10: {(a, b), (b, a), }
11: {(a, a), (a, b), (b, a), }
12: {(a, c), (b, a), }
13: {(a, a), (a, c), (b, a), }
14: {(a, b), (a, c), (b, a), }
15: {(a, a), (a, b), (a, c), (b, a), }
16: {(b, b), }
17: {(a, a), (b, b), }
18: {(a, b), (b, b), }
19: {(a, a), (a, b), (b, b), }
20: {(a, c), (b, b), }
21: {(a, a), (a, c), (b, b), }
22: {(a, b), (a, c), (b, b), }
23: {(a, a), (a, b), (a, c), (b, b), }
24: {(b, a), (b, b), }
25: {(a, a), (b, a), (b, b), }
26: {(a, b), (b, a), (b, b), }
27: {(a, a), (a, b), (b, a), (b, b), }
28: {(a, c), (b, a), (b, b), }
29: {(a, a), (a, c), (b, a), (b, b), }
30: {(a, b), (a, c), (b, a), (b, b), }
31: {(a, a), (a, b), (a, c), (b, a), (b, b), }
32: {(b, c), }
33: {(a, a), (b, c), }
34: {(a, b), (b, c), }
35: {(a, a), (a, b), (b, c), }
36: {(a, c), (b, c), }
37: {(a, a), (a, c), (b, c), }
38: {(a, b), (a, c), (b, c), }
39: {(a, a), (a, b), (a, c), (b, c), }
40: {(b, a), (b, c), }
41: {(a, a), (b, a), (b, c), }
42: {(a, b), (b, a), (b, c), }
43: {(a, a), (a, b), (b, a), (b, c), }
44: {(a, c), (b, a), (b, c), }
45: {(a, a), (a, c), (b, a), (b, c), }
46: {(a, b), (a, c), (b, a), (b, c), }
47: {(a, a), (a, b), (a, c), (b, a), (b, c), }
48: {(b, b), (b, c), }
49: {(a, a), (b, b), (b, c), }
50: {(a, b), (b, b), (b, c), }
51: {(a, a), (a, b), (b, b), (b, c), }
52: {(a, c), (b, b), (b, c), }
53: {(a, a), (a, c), (b, b), (b, c), }
54: {(a, b), (a, c), (b, b), (b, c), }
55: {(a, a), (a, b), (a, c), (b, b), (b, c), }
56: {(b, a), (b, b), (b, c), }
57: {(a, a), (b, a), (b, b), (b, c), }
58: {(a, b), (b, a), (b, b), (b, c), }
59: {(a, a), (a, b), (b, a), (b, b), (b, c), }
60: {(a, c), (b, a), (b, b), (b, c), }
61: {(a, a), (a, c), (b, a), (b, b), (b, c), }
62: {(a, b), (a, c), (b, a), (b, b), (b, c), }
63: {(a, a), (a, b), (a, c), (b, a), (b, b), (b, c), }

元素个数计算公式:

N_e = 最终列表中的元素数;

k 和 j = 给定集合中的元素数;

N_e=2^{k*j}

不发布代码,但这是一种可能的解决方案:

1) 首先创建一个所有主要关系的数组。即对于您的上述输入,它将是 {(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)}。将其存储在二维数组中。

2) 现在您所要做的就是打印出这些集合的所有 nCr 组合。

(1) 可以使用两个 for 循环来实现,并且 (2) 您可以 google(或 bing)一些算法。

我明白了。

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>
#include <sstream>
#include <cmath>
#include <iterator>
#include <bitset>
#include <limits>
#include <algorithm>
#include <gmpxx.h>

using namespace std;
void printVector(vector <string> inComing);
long long calcElem(long long n1);

void getList(vector <string> &answersList, vector <string> setList, long long nPossibleElements);
void combineSets(vector <string> &setList, string set1, string set2);


int main(){
    //initializing variables
    int flag = 1; //flag for user input = 0; for build in string = 1
    long long nPossibleElements = 0;
    long long nSet2 = 0;
    long long nTest1 = 0;
    long long nTest2 = 0;
    //string input, nInput;
    string s_setA = { "abc" }, s_setB = {"ab"};
    vector <string> v_Answers, v_setA, v_setB, v_SetList;

    if (flag == 0)
    {
        cout << "Enter set A (no spaces): ";
        getline(cin, s_setA);

        cout << "Enter set B (no spaces): ";
        getline(cin, s_setB);
    }

    combineSets(v_SetList, s_setA, s_setB);
    nPossibleElements = calcElem(s_setA.size()*s_setB.size()); 
    getList(v_Answers, v_SetList, nPossibleElements);
    printVector(v_Answers);

    cout << "Part2. Enter number of elements in sets(separated by space): ";
    cin >> nTest1 >> nTest2;

    cout << "The answer for |Domain| = " << nTest1 << " and |Codomain| = " << nTest2 << " is " << calcElem(nTest1* nTest2) << endl;

}

    //Prints out the vector elements
void printVector(vector <string> inComing){

        for (size_t i = 0; i < inComing.size(); i++)
        {
            cout << i << ": " << inComing[i] << endl;
        }
    }

        //function to calculate # of possible answers
long long calcElem(long long n1)
    {
        long long temp = 2;

        for (size_t index = 1; index < n1; index++)
        {
            temp *= 2;
        }

        return temp;
    }

        //Building answers combination
void combineSets(vector <string> &tempSet, string set1, string set2)
    {

        for (size_t a = 0; a < set1.size(); a++)
        {
            for (size_t b = 0; b < set2.size(); b++)
            {
                stringstream temp;
                temp << "(" << set1[a] << ", " << set2[b] << "), ";
                tempSet.push_back(temp.str());
            }
        }
    }

void getList(vector <string> &answersList, vector <string> setList, long long nPossibleElements)
    {
        for (size_t index = 0; index < nPossibleElements; index++)
        {
            string s = bitset<numeric_limits<unsigned long long>::digits>(index).to_string();
    string::size_type n = s.find('1');
    string temp;

    if (n != string::npos)
    {
        temp = s.substr(n);
        reverse(temp.begin(), temp.end());
    }

    string tempString = "{";

    for (size_t elem = 0; elem < temp.size(); elem++)
    {
        if (temp[elem] == '1')
        {
            tempString.append(setList[elem]);
        }
    }
    tempString.append("}");
    answersList.push_back(tempString);
    }
}