实验原理
首先输入一个正整数,然后调用calFactor函数计算因子并得到元素个数,接着调用calCover函数计算盖住关系,最后调用judge函数判断是否为有补格。
#include<iostream>
using namespace std;
int factor[50]; //用来存放因子
int matrix[50][50]; //用来存放关系矩阵以及盖住关系
int calFactor(int n); //用来计算因子
void calCover(int cnt); //用来计算盖住关系
void judge(int cnt); //用来判断是否为有补格
int gcd(int a, int b); //用来计算最大公约数
int main()
{
int n,cnt;
cout << "请输入一个正整数:";
cin >> n;
cnt = calFactor(n);
calCover(cnt);
judge(cnt);
return 0;
}
int calFactor(int n)
{
int cnt = 0;
cout <<"它的因子为:";
for (int i = 1; i <= n / 2; i++)
{
if (n % i == 0)
{
factor[cnt++] = i;
cout << i << ",";
}
}
factor[cnt++] = n;
cout << n << endl;
return cnt;
}
void calCover(int cnt)
{
for (int i = 0; i < cnt; i++) //计算关系矩阵
{
for (int j = 0; j < cnt; j++)
{
if (factor[j] % factor[i] == 0)
{
matrix[i][j] = 1;
}
}
}
for (int i = 0; i < cnt; i++) //计算盖住关系
{
for (int j = 0; j < cnt; j++)
{
for (int k = 0; k < cnt; k++)
{
if (i != j && j != k && i!=k)
{
if (matrix[i][k] && matrix[k][j])
matrix[i][j] = 0;
}
}
}
}
for (int i = 0; i < cnt; i++)
{
matrix[i][i] = 0;
}
cout << "盖住关系为:{"; //输出盖住关系
for (int i = 0; i < cnt; i++)
{
for (int j = 0; j < cnt; j++)
{
if (matrix[i][j])
cout << "<" << factor[i] << "," << factor[j] << "> ";
}
}
cout << "}" << endl;
}
int gcd(int a, int b) //求最大公约数
{
int r = 1;
while (r != 0)
{
r = a % b;
a = b;
b = r;
}
return a;
}
void judge(int cnt)
{
int flag;
for (int i = 0; i < cnt; i++)
{
flag = 0;
for (int j = 0; j < cnt; j++)
{
if (i != j)
{
int g = gcd(factor[i], factor[j]);
int l = factor[i] * factor[j] / g;
if (g == factor[0] && l == factor[cnt-1])
{
flag = 1;
break;
}
}
}
if (!flag) //只要有一个元素没有补元就不是有补格
{
cout << "该格不是有补格。";
return;
}
}
cout << "该格是有补格。";
}
整除关系中,任意两个元素的最大下界就是它们的最大公约数,最小上界就是它们的最小公倍数。