南邮离散数学实验三-偏序关系中盖住关系的求取及格论中有补格的判定
来源:互联网 发布:python定义json字符串 编辑:程序博客网 时间:2024/04/30 03:27
一、 实验目的和要求
内容:
编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格。
要求:
对任意给定正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其是否为格、有界格、有补格。并输出所有元素各自的补元素。
程序要求输入任意整数,输出它所有的因子,所有的整除关系,所有的盖住关系,判断对应的偏序集是不是一个格,是不是一个有界格,如果是有界格,是不是一个有补格,如果是有补格,输出所有元素的补元素,如果不是有补格,输出没有补元素的元素,以及有补元素的元素的补元素。
#include <iostream>#include <vector>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int n; //保存输入的整数nvector<int> a; //保存n的所以因子struct note //表示序偶的结构体{ int x,y; note(int aa,int bb) { x=aa; y=bb; }};vector<note> zhenchu; //保存所有整除关系的序偶vector<note> COV; //保存所有盖住关系的序偶vector<int> HasNoBu; //保存没有补元素的元素vector<int> Bu[10000]; //保存有补元素的元素的补元素void Prime() //计算出n的因子{ for(int i=1;i<=n;i++) { if(n%i==0) { a.push_back(i); } }}void Divided() //计算出整除关系 并保存在zhenchu数组{ for(int i=0;i<a.size();i++) { for(int j=i;j<a.size();j++) { if(a[j]%a[i]==0) { note tmp(a[i],a[j]); zhenchu.push_back(tmp); } } }}void SolveCOV() //计算出所有盖住关系,并保存在COV数组{ for(int i=0;i<a.size()-1;i++) { for(int j=i+1;j<a.size();j++) { if(a[j]%a[i]==0) { int flag=0; for(int k=i+1;k<j;k++) { if(a[k]%a[i]==0&&a[j]%a[k]==0) { flag=1; break; } } if(flag==0) { note tmp(a[i],a[j]); COV.push_back(tmp); } } } }}int gcd(int x,int y) //计算最小公倍数{ int r=1; while(r) { r=y%x; y=x; x=r; } return y;}bool JudgeGe() //判断是不是格{ for(int i=0;i<a.size();i++) { for(int j=i+1;j<a.size();j++) { int index=find(a.begin(),a.end(),gcd(a[i],a[j]))-a.begin(); if(index==a.size()) { return false; } index=find(a.begin(),a.end(),a[i]*a[j]/gcd(a[i],a[j]))-a.begin(); if(index==a.size()) { return false; } } } return true;}int G[10010][10010]; //判断是不是有界格用到的图int flag; //深度优先搜索过程中,如果找到某个元素不比最大元素小,则flag标志成1void DFS(int cur){ if(flag) return; int tmp=0; for(int i=cur+1;i<=n;i++) { if(G[cur][i]==1) { tmp=1; break; } } if(tmp==0&&cur!=n) //找到不是有界格的条件 { flag=1; return ; } for(int i=cur+1;i<=n;i++) { if(G[cur][i]==1) { DFS(i); } }}bool JudgeYouJieGe() //判断有界格,用有向图的深度优先遍历来判断是不是有界格{ flag=0; memset(G,0,sizeof(G)); for(int i=0;i<COV.size();i++) { G[COV[i].x][COV[i].y]=1; } DFS(1); if(flag==0) { return true; } else { return false; }}bool JudgeYouBuGe() //判断是不是有补格{ int judge=0; for(int i=0;i<a.size();i++) { int tmp=0; for(int j=0;j<a.size();j++) { if(gcd(a[i],a[j])==1 && a[i]*a[j]/gcd(a[i],a[j])==n) { tmp=1; Bu[i].push_back(a[j]); } } if(tmp==0) { judge=1; HasNoBu.push_back(a[i]); } } if(judge==1) { return false; } else { return true; }}int main(){ printf("请输入整数n:"); scanf("%d",&n); Prime(); printf("\n%d的所有因子为:\n",n); for(int i=0;i<a.size();i++) { printf("%d ",a[i]); } Divided(); printf("\n\n所有的整除关系为:\n{"); for(int i=0;i<zhenchu.size();i++) { if(i==0) printf("<%d,%d>",zhenchu[i].x,zhenchu[i].y); else printf(",<%d,%d>",zhenchu[i].x,zhenchu[i].y); } printf("}\n\n"); SolveCOV(); printf("所有的盖住关系为:\nCOV A={"); for(int i=0;i<COV.size();i++) { if(i==0) printf("<%d,%d>",COV[i].x,COV[i].y); else printf(",<%d,%d>",COV[i].x,COV[i].y); } printf("}\n\n"); if(JudgeGe()==true) { printf("经过判断,这个偏序集是一个格\n\n"); } else { printf("经过判断,这个偏序集不是一个格\n\n"); } bool youjiege=JudgeYouJieGe(); if(youjiege==true) { printf("经过判断,这个偏序集是一个有界格\n\n"); } else { printf("经过判断,这个偏序集不是一个有界格\n\n"); } if(youjiege==true) { if(JudgeYouBuGe()==true) { printf("经过判断,这个偏序集是一个有补格\n各个元素的补元素分别是:\n"); for(int i=0;i<a.size();i++) { printf("%d 的补元素是:",a[i]); for(int j=0;j<Bu[i].size();j++) { printf("%d ",Bu[i][j]); } printf("\n"); } } else { printf("经过判断,这个偏序集不是一个有补格\n\n没有补元素的元素是:"); for(int i=0;i<HasNoBu.size();i++) { printf("%d ",HasNoBu[i]); } printf("\n\n"); printf("其余元素都有补元素,各自的补元素分别是:\n"); for(int i=0;i<a.size();i++) { if(Bu[i].size()!=0) { printf("%d 的补元素是:",a[i]); for(int j=0;j<Bu[i].size();j++) { printf("%d ",Bu[i][j]); } printf("\n"); } } } } return 0;}
0 0
- 【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定
- 南邮离散数学实验三-偏序关系中盖住关系的求取及格论中有补格的判定
- 南邮离散数学实验3 偏序关系中盖住关系的求取及格论中有补格的判定
- 离散数学 偏序关系中盖住关系的求取及格论中有补格的判定
- 南京邮电大学离散数学实验三偏序关系中盖住关系的求取及格论中有补格的判定
- 偏序关系中盖住关系的求取及格论中有补格的判定
- 盖住关系的验证
- 【离散数学实验】关系R的性质判断
- 南邮离散数学实验 利用真值表法求取主析取范式以及主合取范式的实现
- 离散数学中等价关系的认识
- 【离散数学实验】相容关系的极大相容类的计算
- 离散数学实验之求解关系的闭包运算
- 离散数学与计算机的关系
- 南邮离散数学实验2 集合上二元关系性质判定的实现
- 关系模式候选键求取的算法
- 【离散数学】实验二 集合上二元关系性质判定的实现
- 离散数学之集合上关系的判断
- 【离散数学实验】关系R的幂运算及其传递闭包的计算
- 反思
- 使用nodejs数据库ORM(Object Relational Mapping)模块
- Linux 使用mysql简单教程
- Hibernate-Usage(basis)(hibernate基本用法)
- Python爬虫/文本处理/科学计算/机器学习——工具包总结
- 南邮离散数学实验三-偏序关系中盖住关系的求取及格论中有补格的判定
- 2016 总结记
- 关于mysql中由于类型转换导致索引无法使用的问题
- LeetCode 231. Power of Two
- CodeForces 59AWord 水题
- Spring自动检测并装配bean
- 远程调用的几种方式
- 【PAT】1004. Counting Leaves (30)
- 在linux环境中编译JNI的文件为.so包