【離散數學】實驗三 偏序關係中蓋住關係的求取及格論中有補格的斷定

  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

相關文章
相關標籤/搜索