南郵 | 離散數學實驗三:偏序關係中蓋住關係的求取及格論中有補格的判定

題目:輸入 n,求 1~n 中的滿足整除關係的因子。再根據蓋住關係的原理求蓋住關係。最後判斷是否爲有補格。任意輸入一個整數作爲 n 值。

程序代碼

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
int count = 0;  //從 0 開始計數
int n;  //正整數
int factors[100];  //存因子
int matrixs[100][100] = {0};  //初始化爲 0 


//計算正整數 n 的因子
void factor(){
	cout << "The factors of " << n << " are: " << endl;
	for(int i = 1; i <= n/2; ++i){  //到 n/2 結束就行
		if(n % i == 0){
			factors[count++] = i;
			cout << i << ",";
		}
	}
	factors[count] = n;  //n 自己也是因子
	cout << n << endl;
}


//蓋住關係
void cover(){
	//關係矩陣初始化
	for(int i = 0; i <= count; ++i){
		for(int j = 0; j <= count; ++j){
			if(factors[j] % factors[i] == 0){  //如果滿足整除關係,就設爲 1
				matrixs[i][j] = 1;
			}
		}
	}
	//開始判斷
	for(int i = 0; i <= count; ++i){
		for(int j = 0; j <= count; ++j){
			for(int k = 0; k <= count; ++k){
				matrixs[k][k] = 0;  //先去掉自反性
				if(matrixs[i][j] && matrixs[j][k]){
					matrixs[i][k] = 0;  //再去掉傳遞性
				}
			}
		}
	}
	cout << "The cover is: {";
	for(int i = 0; i <= count; ++i){
		for(int j = 0; j <= count; ++j){
			if(matrixs[i][j]){  //除去前面去掉的,其他就滿足蓋住關係了
				cout << " <" << factors[i] << "," << factors[j] << ">";
			}
		}
	}
	cout << " }" << endl;
}

//求最大公約數
int gcd(int x, int y){
	int m;
	//輾轉相除法
	while(m != 0){
		m = x % y;
		x = y;
		y = m;
	}
	return x;
}

//判斷有補格
void complemented_lattice(){
	bool flag;
	int Gcd, Lcm;
	for(int i = 1; i < count; i++)
	{
		flag = false;
		for(int j = 1; j < count; j++)
		{
			if(i == j)
				continue;
			Gcd = gcd(factors[i], factors[j]);  //最大公約數,即最大下界
            Lcm = factors[i] / Gcd * factors[j];  //最小公倍數,即最小上界
			if(Gcd == factors[0] && Lcm == factors[count])  //最大下界爲 1,最小上界爲 n
			{
				flag = true;
				break;
			}
			if(!flag)
			{
				cout << "This is not complemented lattice!" << endl;
				return;
			}
		}
	}
	cout << "This is complemented lattice!" << endl;
	return;
}


int main(){
	cout << "Please input a positive integer: ";
	cin >> n;
	cout << endl;
	factor();
	cout << endl;
	cover();
	cout << endl;
	complemented_lattice();
	cout << endl;
	return 0;
}

實驗結果

  • 測試數據一

n:25

因子爲:1,5,25。

蓋住關係爲:{ <1,5> <5,25> }。

是有補格。
在這裏插入圖片描述

  • 測試數據二

n:24

因子爲:1,2,3,4,6,8,12,24。

蓋住關係爲:{ <1,2> <1,3> <2,4> <2,6> ❤️,6> <4,8> <4,12> <6,12> <8,24> <12,24> }。

不是有補格。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章