偏序关系中盖住关系的求取及格论中有补格的判定
2015-12-07 21:59
316 查看
//二元关系为整除,是正整数上的偏序集,该偏序集中任意两个元素的最小公倍数和最大公约数就是这两个元素的最小上界和最大下界因此它是格 #include<iostream> using namespace std; int num=0; //正整数 int n=0; #define MA 50 int a[MA][MA]={0}; //关系矩阵 int b[MA]={0}; //存1到num中能整除num的数字 int gcd(int x,int y) //辗转相除法求最大公约数 { int r; if(x<y) { r=x; x=y; y=r; } r=1; while(r) { r=x%y; x=y; y=r; } return x; } int lcm(int x,int y) //最小公倍数 { return x*y/gcd(x,y);//开始写错了 } void cal_b() //计算偏序集元素 { for(int i=1;i<=num/2;i++) //n/2就够了 { if(num%i==0) { b[n++]=i; } } b =num; } void cal_a() //计算关系矩阵 { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) if(b[i]%b[j]==0) a[i][j]=1; } void calcover() //计算并输出盖住集 { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) for(int k=0;k<=n;k++) { a[k][k]=0; if(a[i][j]&&a[j][k]) a[i][k]=0; } cout<<"盖住集为{"; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { if(a[i][j]) cout<<"<"<<b[i]<<","<<b[j]<<">"; } cout<<"}"<<endl; } void judge() //判断是否为补格 { int flag[MA]={0}; //来存是否存在一个补元 for(int i=1;i<n;i++) { for(int j=1;j<n;j++) { if(i==j) continue; if(gcd(b[i],b[j])==1&&lcm(b[i],b[j])==num) { flag[i]=1; break; } } } for(int i=1;i<n;i++) if(!flag[i]) { cout<<"不是有补格!"<<endl; return; } cout<<"是有补格!"<<endl; } int main() { while(1) { n=0; cout<<"正整数(元素范围为1到该正整数)"<<endl; cin>>num; cal_b(); cal_a(); calcover(); judge(); cout<<endl; } return 0; }
相关文章推荐
- 迷宫建模
- 自己写的一个简单的android记事本app
- 页面重构基础(一)
- EdgeRank
- ios系列UI篇——UISwitch
- python核心编程-封包
- 图之AVO拓扑排序
- 从涂鸦到发布——理解API的设计过程(转)
- java泛型程序设计——约束与局限性
- 【数学-求组合数的最小公倍数】HDOJ CRB and Candies 5407
- CSU 1556-Jerry's trouble(快速幂)
- hdu1785 You Are All Excellent (极角排序)
- Linux Mint 18.3 (Sylvia)
- Hadoop集群服务器以及相关硬件选择的一些认识
- 7项目常用总结
- 操作系统实验五 虚拟存储器管理
- OpenGL中各种坐标系的理解
- 《剑指offer》——和为S的连续正数序列
- mkdir命令
- R语言简单入门