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

实验目的和要求

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

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

#include 
#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 << "不是格\n";
				return ;
			}
		}
	}
	cout << "是格\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 << "不是补格\n";
			return ;
		}
	}
	cout << "有补格\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>}

是格

不是补格

测试数据225

运行结果:

A:{1,2,3,6}

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

是格

有补格

测试数据31

运行结果:

A:{1}

COV A={}

是格

有补格

你可能感兴趣的:(离散数学,算法,c++,数据结构)