南邮|离散数学实验三(偏序关系中盖住关系的求取及各论中有补格的判定)

实验目的和要求

1.对任意给定的正整数,求其所有因子构成集合上的整除关系上所有的盖住关系,并判断对应的偏序集是否为格。

2.判断其是否为有补格。

#include <iostream>
#define MAX 100
using namespace std;

int n;
int A[MAX];
int R[MAX];
int COVA[MAX];

//最大公约数
int GCD(int m,int n) {
	int mid = m>n?n:m;
	int res = m>n?m%n:n%m;
	if(res) {
		return GCD(mid,res);
	} else {
		return mid;
	}
}

//最小公倍数
int LCM(int m,int n) {
	int gcd = GCD(m,n);
	int res = gcd*(m/gcd)*(n/gcd);
	return res;
}

//输出集合A
void CA() {
	cout << "A:{" ;
	for(int i=1,count=0; i<=n; i++) {
		if(n%i==0) {
			A[count++]=i;
			cout << i << (i==n?"":",");
		}
	}
	cout << "}\n" ;
}

//输出盖住关系
void CCOVA() {
	//关系R
	for(int i=0,k=0; A[i]; i++) {
		for(int j=i; A[j]; j++) {
			if(A[j]%A[i]==0) {
				R[k++]=A[i];
				R[k++]=A[j];
			}
		}
	}
	cout << "COV A={";
	for(int i=0,count=0; R[i]; i+=2) {
		int flag = 1;
		if(R[i]==R[i+1]) continue;
		for(int j=0; R[j]; j+=2) {
			if(R[j]==R[j+1]) continue;
			for(int k=j+2; R[k]; k+=2) {
				if(R[k]==R[k+1]) continue;
				if(R[i]==R[j] && R[i+1]==R[k+1] && R[j+1]==R[k])  flag = 0;
			}
		}
		if(flag) {
			COVA[count++]=R[i];
			COVA[count++]=R[i+1];
			cout << "<" << R[i] << "," << R[i+1] << ">";
		}
	}
	cout << "}\n";
}

//输出格的判定结果
void CGe() {
	for(int i=0; A[i]; i++) {
		for(int j=0; A[j]; j++) {
			int flag1 = 1,flag2 = 1;
			for(int k=0; A[k]; k++) {
				//最大下界
				if(GCD(A[i],A[j])==A[k])flag1 = 0;
				//最小上界
				if(LCM(A[i],A[j])==A[k])flag2 = 0;
			}
			if(flag1) {
				cout << "<A,|>不是格\n";
				return ;
			}
		}
	}
	cout << "<A,|>是格\n";
}

//输出补格的判定结果
void  CBuGe() {
	for(int i=0; A[i]; i++) {
		int flag = 0;
		for(int j=0; A[j]; j++) {
			//上确界是n,下确界是1
			if(GCD(A[i],A[j])==1 && LCM(A[i],A[j])==n) flag=1;
		}
		if(!flag) {
			cout << "<A,|>不是补格\n";
			return ;
		}
	}
	cout << "<A,|>有补格\n";
}

int main() {
	cout << "请输入一个正整数:";
	cin >> n;
	CA();
	CCOVA();
	CGe();
	CBuGe();
	return 0;
}

测试数据136

运行结果:

A:{1,2,3,4,6,9,12,18,36}

COV A={<1,2><1,3><2,4><2,6><3,6><3,9><4,12><6,12><6,18><9,18><12,36><18,36>}

<A,|>是格

<A,|>不是补格

测试数据225

运行结果:

A:{1,2,3,6}

COV A={<1,2><1,3><2,6><3,6>}

<A,|>是格

<A,|>有补格

测试数据31

运行结果:

A:{1}

COV A={}

<A,|>是格

<A,|>有补格

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任性不认命~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值