1.實驗目的
編程實現整除關系這一偏序關系上所有蓋住關系的求取,並判定對應的偏序集是否為格。
2.實驗要求
對任意給定的正整數,利用整除關系求所有由其因子構成的集合所構成的格,判斷其是否為有補格。
3.編碼思路
將該正整數的因子保存在數組中,利用蓋住關系的性質,兩個數a、b之間不存在第三者c,使得a整除c,c整除b,即可求取所有蓋住關系。
整除關系對應的偏序集都是格,所以不用判斷,接下來是判斷有補格。利用性質,首先,格的全上界一定是輸入,的正整數,全下界一定是1,所以就根據這個來判斷補元。兩重循環,如果每個因子都能找到另一個因子,使它們的最小公倍數為輸入的正整數,最大公約數為1,那么就是有補格。
代碼如下,只用了一個gcd函數:
/*
*實驗目的:編程實現整除關系這一偏序關系上所有蓋住關系的求取,並判定對應的偏序集是否為格。
*實驗要求:對任意給定的正整數,利用整除關系求所有由其因子構成的集合所構成的格,判斷其是否為有補格。
*運行環境:Code::Blocks 13.12
*/
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
const int LEN = 140 + 10;
//Variable;
int n;
int cnt;
int arr[LEN];
//求最大公約數
int gcd(int n, int m);
int main()
{
cout << "請輸入一個整數(>0) : ";
while(cin >> n) //連續輸入,Ctrl+Z終止
{
cout << endl;
int k = (int)floor(sqrt(n) + 0.5);
cnt = 1;
for(int i = 1; i <= k; i++)
{
if(n % i == 0)
{
if(i != n/i)
{
arr[cnt++] = i;
arr[cnt++] = n/i;
}
else
{
arr[cnt++] = i;
}
}
}
sort(arr, arr+cnt); //排序
//輸出偏序集上的蓋住關系
cout << "輸出偏序集上的蓋住關系 : " ;
for(int i = 1; i < cnt; i++)
{
for(int j = i + 1; j < cnt; j++)
{
if(arr[j] % arr[i] == 0 && i < j)
{
bool flag = true;
for(int k = i + 1; k < j; k++)
{
if(arr[j] % arr[k] == 0 && arr[k]%arr[i] == 0 && i < k && k < j)
{
flag = false;
break;
}
}
if(flag)
{
cout << "(" << arr[i] << "," << arr[j] << ")" << " ";
}
}
}
}
cout << endl << endl;
int brr[LEN];
memset(brr, 0, sizeof(brr));
for(int i = 1; i < cnt; i++)
{
for(int j = i + 1; j < cnt; j++)
{
int temp = gcd(arr[i], arr[j]);
if(temp == 1 && arr[i] * arr[j] == n)
{
brr[i] = 1;
brr[j] = 1;
break;
}
else
{
continue;
}
}
}
bool res = true;
for(int i = 1; i < cnt; i++)
{
if(brr[i] == 0)
{
res = false;
}
}
if(res)
{
cout << "是有補格!" << endl << endl;
}
else
{
cout << "不是有補格!" << endl << endl;
}
memset(arr, 0, sizeof(arr));
memset(brr, 0, sizeof(brr));
cout << "請輸入一個整數(>0) : ";
}
return 0;
}
int gcd(int n, int m)
{
if(n < m)
{
int temp = n;
n = m;
m = temp;
}
int remainer = n % m;
while(remainer)
{
n = m;
m = remainer;
remainer = n % m;
}
return m;
}
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
