題目:輸入 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> }。
不是有補格。