第三次离散实验 代码

#include
const int N=100;
class Function //定义一个Function类
{
private:
int A[N]; //定义一个数组A,用于存储正整数的因子
int integer; //整数,用于存储用户输入的正整数值
int number; //用于记录A中因子的个数
public:
void InputInteger(); //用户输入一个整数的函数
void FindFactor(); //找出该整数中的所有因子
void FindCover(); //求取中的盖住关系
void JudgeComplementedlattice(); //判断是否为有补格
};


void Function::InputInteger()
{
do
{ cout<<"请输入一个正整数:";
cin>>integer;
}while(integer<=0);
}

void Function::FindFactor()
{
int i=0;
for(int n=1;n<=integer;n++) //用遍历的方法求取整数中的因子
{
if(integer%n==0)
A[i++]=n;
}
number=i; //记录因子个数
cout<<"A={";
for(int j=0;j{
if(j==number-1)
cout<else
cout<}
cout<<"}"<}

void Function::FindCover()
{
cout<<"Cover A={ ";
for(int i=0;i{
for(int j=i+1;j{ int flag=1; //flag标志
if(A[j]%A[i]==0)
{
for(int k=i+1;k{
if(A[k]%A[i]==0&&A[j]%A[k]==0)
flag=0; //若有,flag置零
}
if(flag==1)
cout<<"<"<"<<"\t";
}
}
}
cout<<"}"<}

void Function::JudgeComplementedlattice()
{
int gcd,lcm;
int dividend,divisor,remainder;
int flag1=1; //标志1
for(int i=0;i{ //标志2
int flag2=0;
for(int j=i+1;j{
divisor=A[i]; //用辗转相除法求最大公约数
dividend=A[j];
do{
remainder=dividend%divisor;
dividend=divisor;
divisor=remainder;
}while(remainder>0);
gcd=dividend;
lcm=A[i]*A[j]/gcd; //求得最小公倍数
if(gcd==A[0]&&lcm==A[number-1])
flag2=1; //只要找到一个A[i]对应的补元素,就说明A[i]是有补元素的
}
for(int k=0;k{
divisor=A[k];
dividend=A[i];
do{
remainder=dividend%divisor;
dividend=divisor;
divisor=remainder;
}while(remainder>0);
gcd=dividend;
lcm=A[k]*A[i]/gcd;
if(gcd==A[0]&&lcm==A[number-1])
flag2=1;
}
if(flag2==0) //一个二级循环下来后,flag2仍然为0,说明A[i]未找到其补元素
{
flag1=0; //那它就不是有补格了,flag1置零
break; //后面也就不用判断了
}
}
if(flag1==1)
cout<<"是有补格."<else
cout<<"不是有补格"<}


//头文件

//#include"DM.h"
int main()
{
cout<<"令 由正整数因子所

构成的集合A和整除关系这二者构成的偏序集合为."<cout<<"本程序用来求取的盖住关系以及判定是否为有补格."<Function demo;
demo.InputInteger();
demo.FindFactor();
demo.FindCover();
demo.JudgeComplementedlattice();
return 0;
}

相关文档
最新文档