实验名称:偏序关系中盖住关系的求取及格论中有补格的判定
实验目的:通过编程实现偏序关系中盖住关系的求取及格论中有补格的判定以巩固相关理论的掌握
要求:
(1)从屏幕输入一个正整数
(2)列出由该整数所有因子构成的盖住关系
(3)给出由其因子构成的格是否为有补格的判定
(4)如:输入6,则输出<1, 2>, <1, 3>, <2, 6>, <3, 6>以及是有补格
#include<iostream>
#include<cstring>
using namespace std;
#define N 100
int a[N] = {};//记录正整数n中的所有因子
int n;//需要输入的正整数
int cnt = 0;//正整数n的因子个数
void cover();
void factor();
void complemented();
int main()
{
cout << "请输入一个正整数n:";
cin >> n;//输入正整数n
factor();
cover();
complemented();
return 0;
}
void factor()//找出正整数n的因子
{
int i, m;
for (i = 1; i < n + 1; i++)
{
m = n % i;
if (m == 0)
{
a[cnt] = i;
cnt++;
}
}
}
void cover()//找出盖住关系
{
int i, j, k;
int m = 0;
cout << "盖住关系为:" << endl;
for (i = 0; i < cnt; i++)
{
for (j = i; j < cnt; j++)
{
if (a[j] % a[i] == 0)
{
if ((j - i) == 1)
{
cout << "<" << a[i] << "," << a[j] << ">" << endl;
}
if ((j - i) > 1)
{
m = 0;
for (k = i+1; k < j; k++)
{
if ((a[k] % a[i] == 0) && (a[j] % a[k] == 0))
{
m++;
}
}
if (m == 0)
{
cout << "<" << a[i] << "," << a[j] << ">" << endl;
}
}
}
}
}
}
void complemented()//判断是否为有补格
{
int i, j,temp,rem,p,q,min,max;
int b[N] = {};
for (i = 0; i < cnt; i++)
{
for (j = i; j < cnt; j++)
{
if (a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
p = a[i];
q = a[j];
rem = p % q;
while (rem)//辗转相除法
{
p = q;
q = rem;
rem = p % q;
}
min = a[i] * a[j] / q;
max = q;
if (min == n && max == 1)
{
b[i] = 1;
break;
}
}
}
int flag = 1;
for (i = 0; i < cnt; i++)
if (b[i] == 0)
flag = 0;
if (flag)
{
cout << "是有补格" << endl;
}
else
{
cout << "不是有补格" << endl;
}
}