题目:输入 n,求 1~n 中的满足整除关系的因子。再根据盖住关系的原理求盖住关系。最后判断是否为有补格。任意输入一个整数作为 n 值。
程序代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
int count = 0; //从 0 开始计数
int n; //正整数
int factors[100]; //存因子
int matrixs[100][100] = {0}; //初始化为 0
//计算正整数 n 的因子
void factor(){
cout << "The factors of " << n << " are: " << endl;
for(int i = 1; i <= n/2; ++i){ //到 n/2 结束就行
if(n % i == 0){
factors[count++] = i;
cout << i << ",";
}
}
factors[count] = n; //n 自己也是因子
cout << n << endl;
}
//盖住关系
void cover(){
//关系矩阵初始化
for(int i = 0; i <= count; ++i){
for(int j = 0; j <= count; ++j){
if(factors[j] % factors[i] == 0){ //如果满足整除关系,就设为 1
matrixs[i][j] = 1;
}
}
}
//开始判断
for(int i = 0; i <= count; ++i){
for(int j = 0; j <= count; ++j){
for(int k = 0; k <= count; ++k){
matrixs[k][k] = 0; //先去掉自反性
if(matrixs[i][j] && matrixs[j][k]){
matrixs[i][k] = 0; //再去掉传递性
}
}
}
}
cout << "The cover is: {";
for(int i = 0; i <= count; ++i){
for(int j = 0; j <= count; ++j){
if(matrixs[i][j]){ //除去前面去掉的,其他就满足盖住关系了
cout << " <" << factors[i] << "," << factors[j] << ">";
}
}
}
cout << " }" << endl;
}
//求最大公约数
int gcd(int x, int y){
int m;
//辗转相除法
while(m != 0){
m = x % y;
x = y;
y = m;
}
return x;
}
//判断有补格
void complemented_lattice(){
bool flag;
int Gcd, Lcm;
for(int i = 1; i < count; i++)
{
flag = false;
for(int j = 1; j < count; j++)
{
if(i == j)
continue;
Gcd = gcd(factors[i], factors[j]); //最大公约数,即最大下界
Lcm = factors[i] / Gcd * factors[j]; //最小公倍数,即最小上界
if(Gcd == factors[0] && Lcm == factors[count]) //最大下界为 1,最小上界为 n
{
flag = true;
break;
}
if(!flag)
{
cout << "This is not complemented lattice!" << endl;
return;
}
}
}
cout << "This is complemented lattice!" << endl;
return;
}
int main(){
cout << "Please input a positive integer: ";
cin >> n;
cout << endl;
factor();
cout << endl;
cover();
cout << endl;
complemented_lattice();
cout << endl;
return 0;
}
实验结果
- 测试数据一
n:25
因子为:1,5,25。
盖住关系为:{ <1,5> <5,25> }。
是有补格。
- 测试数据二
n:24
因子为:1,2,3,4,6,8,12,24。
盖住关系为:{ <1,2> <1,3> <2,4> <2,6> ❤️,6> <4,8> <4,12> <6,12> <8,24> <12,24> }。
不是有补格。