NJUPT南邮 | 离散数学_实验三

内容:
求取集合A上的整除关系R对应的盖住关系,并判定偏序集是否为格,若是格,判断其是否为有补格。
要求:
集合A可以是用户任意给定的正整数集合。

package exp03;

import java.util.*;
import java.util.stream.Collectors;

class Poset {
    int A[];    // 集合
    int R[][];  // 关系矩阵

    public Poset(int[] a) {
        A = a;
        // 初始化关系矩阵
        R=new int[A.length][A.length];
        for(int i = 0; i < A.length; i++){
            for(int j = 0; j < A.length; j++){
                if(A[j] % A[i] == 0){  //如果满足整除关系,就设为 1
                    R[i][j] = 1;
                }
            }
        }

    }

    // 求取盖住关系
    public void displayCOVER() {

        int matrixs[][]=R;  // 用于判断盖住关系的二元数组
        for(int i = 0; i < A.length; i++){
            for(int j = 0; j <A.length; j++){
                for(int k = 0; k <A.length; k++){
                    matrixs[k][k] = 0;  // 去掉自反性
                    if(matrixs[i][j]==1 && matrixs[j][k]==1){
                        matrixs[i][k] = 0;  // 去掉传递性
                    }
                }
            }
        }

        System.out.print("COV A={");
        for(int i = 0; i <A.length; i++){
            for(int j = 0; j <A.length; j++){
                if(matrixs[i][j]==1){  //除去前面去掉的,其他就满足盖住关系了
                    System.out.print("<"+A[i]+","+A[j]+">,");
                }
            }
        }
        System.out.println("\b}");
    }

    // 判断是否为格
    public boolean isLattice(){
        int Gcd=0;  // 最大公约数
        int Lcm=0;  // 最小公倍数
        boolean flag=true;
        List<Integer> list = Arrays.stream(A).boxed().collect(Collectors.toList()); // 转化为集合便于查询元素
        for(int i=0;i<A.length;i++)
        {
            for (int j=0;j<A.length;j++)
            {
                if(i==j)
                    continue;
                Gcd = gcd(A[i],A[j]); // 求最大下界
                Lcm = A[i] / Gcd * A[j]; // 求最小上界
                // 遍历A,若Gcd和Lcm都在A中,为格
                if(!(list.contains(Gcd)&&list.contains(Lcm)))
                {
                    return false;
                }
            }
        }
        return flag;
    }

    // 求最大公约数
    private int gcd(int x, int y) {
        int m;
        //辗转相除法
        do{
            m = x % y;
            x = y;
            y = m;
        }while(m != 0);
        return x;
    }

    public boolean isComplementedLattice() {
        int Gcd=0;  // 最大公约数
        int Lcm=0;  // 最小公倍数
        boolean flag;
        List<Integer> list = Arrays.stream(A).boxed().collect(Collectors.toList()); // 转化为集合便于查询元素
        Collections.sort(list);
        for(int i=0;i<A.length;i++)
        {
            flag=false;
            for (int j=0;j<A.length;j++)
            {
                if(i==j)
                    continue;
                Gcd = gcd(A[i],A[j]); // 求最大下界
                Lcm = A[i] / Gcd * A[j]; // 求最小上界
                // 有界格
                if( (Gcd==list.get(0)) && (Lcm==list.get(list.size()-1)))
                {
                    flag = true;
                    break;
                }
            }
            if(!flag){
                return false;
            }
        }
        return true;
    }
}

package exp03;

import java.util.Scanner;

public class Test03 {
    public static void main(String[] args) {
        System.out.println("请输入正整数集合A:");
        // 将用户输入转化成数组
        Scanner inA = new Scanner(System.in);
        String stringA[] = inA.nextLine().split(" ");
        int num[] = new int[stringA.length];
        for (int i = 0; i < stringA.length; i++) {
            num[i] = Integer.parseInt(stringA[i]);
            //System.out.println(stringA[i]);
        }
        // 初始化偏序集
        Poset poset=new Poset(num);
        poset.displayCOVER();
        if (poset.isLattice()){
            System.out.println("是格");
            if(poset.isComplementedLattice())
                System.out.println("是有补格");
            else
                System.out.println("不是有补格");
        }else
            System.out.println("不是格");
    }
}

NJUPT南邮 | 离散数学_实验三_第1张图片
NJUPT南邮 | 离散数学_实验三_第2张图片

你可能感兴趣的:(南邮实验,java,开发语言,后端)