1.實驗目的ios
編程實現整除關係這一偏序關係上全部蓋住關係的求取,並斷定對應的偏序集是否爲格。編程
2.實驗要求數組
對任意給定的正整數,利用整除關係求全部由其因子構成的集合所構成的格,判斷其是否爲有補格。函數
3.編碼思路編碼
將該正整數的因子保存在數組中,利用蓋住關係的性質,兩個數a、b之間不存在第三者c,使得a整除c,c整除b,便可求取全部蓋住關係。spa
整除關係對應的偏序集都是格,因此不用判斷,接下來是判斷有補格。利用性質,首先,格的全上界必定是輸入,的正整數,全下界必定是1,因此就根據這個來判斷補元。兩重循環,若是每一個因子都能找到另外一個因子,使它們的最小公倍數爲輸入的正整數,最大公約數爲1,那麼就是有補格。code
代碼以下,只用了一個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; }
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。ci