【离散数学】陪集和拉格朗日定理编程题

1:编写一个程序能够计算有限群G的子群H的左陪集

输入一个n阶有限群G的二元运算表及相关的子群,输出其左陪集。

(注意:按照表头元素顺序计算每个陪集,下图为G的二元运算表示例)

样例1:

输入:

6 2 (注:群的阶和子群阶)

M N P Q R S (注:此7*6阵列为群G的二元运算表红色部分内容)

N P M R S Q

P M N S Q R

M N P Q R S

S R Q P N M

Q S R M P N

R Q S N M P

P Q(注:子群H)

输出: (注:空格分隔,末尾字符也有空格)

P Q (注:这是原来的子群H)

M R (注:用M乘以H中的对应每个元素)

N S (注:用N乘以H中的对应每个元素)

样例2:

输入:

6 3

M N P Q R S

N P M R S Q

P M N S Q R

M N P Q R S

S R Q P N M

Q S R M P N

R Q S N M P

M N P

输出:

M N P

S R Q

参考代码(读入数据):

int ordG, ordH; (G和H的阶数)

char tableG[100][100];

char tablehead[100];

char H[100];

char ch;

int count;

cin>>ordG>>ordH;

for(int i=0;i<ordG+1;i++)

{

if(i==0)

{

count = 0;

ch = ' ';

while ( count < ordG && ch != EOF )

{

cin >> ch;

if ( ch != '\r' && ch != '\n' && ch != ' ' && ch != '\t' )

tablehead[count++] = ch;

}

}

else

{

count = 0;

ch = ' ';

while ( count < ordG && ch != EOF )

{

cin >> ch;

if ( ch != '\r' && ch != '\n' && ch != ' ' && ch != '\t' )

tableG[i-1][count++] = ch;

}

}

}

count = 0;

ch = ' ';

while ( count < ordH && ch != EOF )

{

cin >> ch;

if ( ch != '\r' && ch != '\n' && ch != ' ' && ch != '\t' )

H[count++] = ch;

}

#include <iostream>
#include <vector>
using namespace std;

bool Compare(vector<char> v1,vector<char> v2)
{
    int i,j,t=0;
    int s1=v1.size(),s2=v2.size();
    for(i=0;i<s2;i++)
    {
        for(j=0;j<s1;j++)
        {
            if(v2[i] == v1[j])
            { 
                t++;
            } 
        }
    }
    if(t==s1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

bool Check(vector<vector<char> > v1, vector<char> v2)
{
    int i,s1=v1.size();
    for(i=0;i<s1;i++)
    {
        if(Compare(v1[i],v2))
        {
            return 1;
        }
    }
    return 0;
}

int main() 
{
    int i,j;
    int l1,l2;
    cin>>l1>>l2;
    char** a = new char* [l1+1];
    for(i=0;i<l1+1;i++) 
    {
        *(a+i) = new char[l1];
    }
    for(i=0;i<l1+1;i++)
    {
        for(j=0;j<l1;j++)
        {
            cin>>a[i][j];
        }
    }
    char* b = new char[l2];
    for(i=0;i<l2;i++)
    {
        cin>>b[i];
    }
    int* t = new int [l2];
    for(i=0;i<l2;i++)
    {
        for(j=0;j<l1;j++)
        {
            if(b[i]==a[0][j])
            {
                t[i]=j;
                break;
            }
        }
    }
    vector<vector<char> > result;
    vector<char> c;
    for(i=0;i<l2;i++)
    {
        c.push_back(a[0][t[i]]);
    }
    result.push_back(c);
    c.clear();
    for(i=1;i<l1+1;i++)
    {
        for(j=0;j<l2;j++)
        {
            c.push_back(a[i][t[j]]);
        }
        if(Check(result,c))
        {
            c.clear();
            continue;
        }
        else
        {
            result.push_back(c);
            c.clear();
        }
    }
    for(i=0;i<result.size();i++)
    {
        for(j=0;j<result[i].size();j++)
        {
            cout<<result[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_65787507/article/details/130796641