离散数学实验三 实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格

实验原理

首先输入一个正整数,然后调用calFactor函数计算因子并得到元素个数,接着调用calCover函数计算盖住关系,最后调用judge函数判断是否为有补格。

#include<iostream>
using namespace std;
int factor[50];   //用来存放因子
int matrix[50][50];  //用来存放关系矩阵以及盖住关系
int calFactor(int n);  //用来计算因子
void calCover(int cnt); //用来计算盖住关系
void judge(int cnt);  //用来判断是否为有补格
int gcd(int a, int b);   //用来计算最大公约数
int main()
{
	int n,cnt;
	cout << "请输入一个正整数:";
	cin >> n;
	cnt = calFactor(n);
	calCover(cnt);
	judge(cnt);
	return 0;

}
int calFactor(int n)
{
	int cnt = 0;
	cout <<"它的因子为:";
	for (int i = 1; i <= n / 2; i++)
	{
		if (n % i == 0)
		{
			factor[cnt++] = i;
			cout << i << ",";
		}
	}
	factor[cnt++] = n;
	cout << n << endl;
	return cnt;
}

void calCover(int cnt)
{
	for (int i = 0; i < cnt; i++)	//计算关系矩阵
	{
		for (int j = 0; j < cnt; j++)
		{
			if (factor[j] % factor[i] == 0)
			{
				matrix[i][j] = 1;
			}
		}
	}
	for (int i = 0; i < cnt; i++)		//计算盖住关系
	{
		for (int j = 0; j < cnt; j++)
		{
			for (int k = 0; k < cnt; k++)
			{
				if (i != j && j != k && i!=k)
				{
					if (matrix[i][k] && matrix[k][j])
						matrix[i][j] = 0;
				}
			}
		}
	}
	for (int i = 0; i < cnt; i++)	
	{
		matrix[i][i] = 0;
	}
	cout << "盖住关系为:{";		//输出盖住关系
	for (int i = 0; i < cnt; i++)
	{
		for (int j = 0; j < cnt; j++)
		{
			if (matrix[i][j])
				cout << "<" << factor[i] << "," << factor[j] << "> ";
		}
	}
	cout << "}" << endl;
}
int gcd(int a, int b)	//求最大公约数   
{
	int r = 1;
	while (r != 0)
	{
		r = a % b;
		a = b;
		b = r;
	}
	return a;
}

void judge(int cnt)
{
	int flag;
	for (int i = 0; i < cnt; i++)
	{
		flag = 0;
		for (int j = 0; j < cnt; j++)		
		{
			if (i != j)
			{
				int g = gcd(factor[i], factor[j]);
				int l = factor[i] * factor[j] / g;
				if (g == factor[0] && l == factor[cnt-1])
				{
					flag = 1;
					break;
				}
			}
		}
		if (!flag)		//只要有一个元素没有补元就不是有补格
		{
			cout << "该格不是有补格。";
			return;
		}
	}
	cout << "该格是有补格。";
}

整除关系中,任意两个元素的最大下界就是它们的最大公约数,最小上界就是它们的最小公倍数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值