【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定
2015-11-02 21:00
525 查看
1.实验目的
编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应的偏序集是否为格。
2.实验要求
对任意给定的正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其是否为有补格。
3.编码思路
将该正整数的因子保存在数组中,利用盖住关系的性质,两个数a、b之间不存在第三者c,使得a整除c,c整除b,即可求取所有盖住关系。
整除关系对应的偏序集都是格,所以不用判断,接下来是判断有补格。利用性质,首先,格的全上界一定是输入,的正整数,全下界一定是1,所以就根据这个来判断补元。两重循环,如果每个因子都能找到另一个因子,使它们的最小公倍数为输入的正整数,最大公约数为1,那么就是有补格。
代码如下,只用了一个gcd函数:
编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应的偏序集是否为格。
2.实验要求
对任意给定的正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其是否为有补格。
3.编码思路
将该正整数的因子保存在数组中,利用盖住关系的性质,两个数a、b之间不存在第三者c,使得a整除c,c整除b,即可求取所有盖住关系。
整除关系对应的偏序集都是格,所以不用判断,接下来是判断有补格。利用性质,首先,格的全上界一定是输入,的正整数,全下界一定是1,所以就根据这个来判断补元。两重循环,如果每个因子都能找到另一个因子,使它们的最小公倍数为输入的正整数,最大公约数为1,那么就是有补格。
代码如下,只用了一个gcd函数:
/* *实验目的:编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应的偏序集是否为格。 *实验要求:对任意给定的正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其是否为有补格。 *运行环境:Code::Blocks 13.12 */ #include <cstdlib> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <map> #include <iostream> #include <algorithm> using namespace std; const int LEN = 140 + 10; //Variable; int n; int cnt; int arr[LEN]; //求最大公约数 int gcd(int n, int m); int main() { cout << "请输入一个整数(>0) : "; while(cin >> n) //连续输入,Ctrl+Z终止 { cout << endl; int k = (int)floor(sqrt(n) + 0.5); cnt = 1; for(int i = 1; i <= k; i++) { if(n % i == 0) { if(i != n/i) { arr[cnt++] = i; arr[cnt++] = n/i; } else { arr[cnt++] = i; } } } sort(arr, arr+cnt); //排序 //输出偏序集上的盖住关系 cout << "输出偏序集上的盖住关系 : " ; for(int i = 1; i < cnt; i++) { for(int j = i + 1; j < cnt; j++) { if(arr[j] % arr[i] == 0 && i < j) { bool flag = true; for(int k = i + 1; k < j; k++) { if(arr[j] % arr[k] == 0 && arr[k]%arr[i] == 0 && i < k && k < j) { flag = false; break; } } if(flag) { cout << "(" << arr[i] << "," << arr[j] << ")" << " "; } } } } cout << endl << endl; int brr[LEN]; memset(brr, 0, sizeof(brr)); for(int i = 1; i < cnt; i++) { for(int j = i + 1; j < cnt; j++) { int temp = gcd(arr[i], arr[j]); if(temp == 1 && arr[i] * arr[j] == n) { brr[i] = 1; brr[j] = 1; break; } else { continue; } } } bool res = true; for(int i = 1; i < cnt; i++) { if(brr[i] == 0) { res = false; } } if(res) { cout << "是有补格!" << endl << endl; } else { cout << "不是有补格!" << endl << endl; } memset(arr, 0, sizeof(arr)); memset(brr, 0, sizeof(brr)); cout << "请输入一个整数(>0) : "; } return 0; } int gcd(int n, int m) { if(n < m) { int temp = n; n = m; m = temp; } int remainer = n % m; while(remainer) { n = m; m = remainer; remainer = n % m; } return m; }
相关文章推荐
- 不要以为写写代码就是计算机科学
- 离散数学Notes
- 离散数学 简单推箱子模型 c++
- 【CSE 107 离散数学期末总结:】
- 关于序偶和二元关系的基本概念(摘自Wikipedia)
- 离散数学学习笔记目录
- 排列的问题
- 离散数学之relations
- 实验三:栈和队列
- 拓扑排序
- 2.25周二 离散,概率
- 如何学习离散数学和在计算机科学中应用
- 数理逻辑与集合论发展
- 离散数学实践:常用逻辑联结词计算
- 【离散数学】Warshall算法实现 传递闭包对应矩阵
- 《离散数学》2014第一周作业——组队、预习与作业
- 《离散数学》第二周作业及预习
- 离散数学学习笔记1
- Havel-Hakimi定理问题
- 第一次C程序设计实验报告