您的位置:首页 > 其它

偏序关系中盖住关系的求取及格论中有补格的判定

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: