实验要求
求n的因子函数
我们将n的因子存入数组中,n的因子就是可以整除n的数,所以我们通过一个for循环来求。返回因子个数。
//求n的因子,返回因子个数
int factors(int arr[], int n)
{int j = 0;for (int i = 1; i <= n; i++){if (n % i == 0){arr[j++] = i;}}return j;
}
输出盖住关系
盖住关系就是指arr[i]整除arr[j],找不到arr[k]使得arr[i]整除arr[k],arr[k]整除arr[j]。
所以我们用3个循环来实现,
第一个循环我们找到arr[i],
第二个循环我们找到可以被arr[i]整除的arr[j],因为我们的数组是有序地(因为计算因子时有序存入的),所以开始条件是 =i+1,
第三个循环判断是否有arr[k],因为数组有序,开始条件为 =i + 1,结束条件是 <j。
//输出盖住关系
void envelop(int arr[],int len)
{printf("盖住关系为:");for (int i = 0; i < len; i++){for (int j = i + 1; j < len; j++) {if (arr[j] % arr[i] == 0){int flag = 1;for (int k = i + 1; k < j; k++){if (arr[k] % arr[i] == 0 && arr[j] % arr[k] == 0)flag = 0;}if (flag == 1){printf("<%d,%d>", arr[i], arr[j]);}}}}
}
输出是否为有补格
有补格就是每个元素都存在补元,arr[i]的补元就是指找得到arr[j],使得arr[i]和arr[j]最小公倍数是n,最大公约数是1。
求最小公倍数
//求最小公倍数
int leastCommonMultiple(int a, int b)
{int n = 1;while (n++){if (n % a == 0 && n % b == 0)return n;}
}
求最大公约数
辗转相除法
//求最大公约数
int greatestCommonDivisor(int a, int b)
{int temp = 0;if (a > b){temp = a;a = b;b = temp;}while (1){if (b % a == 0){return a;}temp = b % a;b = a;a = temp;}
}
输出有补格
用flag来标记是不是有补元
第一个循环来找arr[i]
第二个循环来找arr[j],将arr[i]排除,如果第二个循环走完没有补元直接返回了。
//输出是否是有补格
void complementedLattice(int arr[], int len,int n)
{for (int i = 0; i < len; i++){int flag = 0;for (int j = 0; j < len; j++){if(i == j){continue;}if (greatestCommonDivisor(arr[i], arr[j]) == 1 && leastCommonMultiple(arr[i], arr[j]) == n){flag = 1;break;}}if (flag == 0){printf("不是有补格,%d没有补元", arr[i]);return;}}printf("是有补格");
}
源码
# define _CRT_SECURE_NO_WARNINGS 1;
#include<stdio.h>
#include<string.h>
//求n的因子,返回因子个数
int factors(int arr[], int n)
{int j = 0;for (int i = 1; i <= n; i++){if (n % i == 0){arr[j++] = i;}}return j;
}
//输出盖住关系
void envelop(int arr[],int len)
{printf("盖住关系为:");for (int i = 0; i < len; i++){for (int j = i + 1; j < len; j++) {if (arr[j] % arr[i] == 0){int flag = 1;for (int k = i + 1; k < j; k++){if (arr[k] % arr[i] == 0 && arr[j] % arr[k] == 0)flag = 0;}if (flag == 1){printf("<%d,%d>", arr[i], arr[j]);}}}}
}
//求最小公倍数
int leastCommonMultiple(int a, int b)
{int n = 1;while (n++){if (n % a == 0 && n % b == 0)return n;}
}
//求最大公约数
int greatestCommonDivisor(int a, int b)
{int temp = 0;if (a > b){temp = a;a = b;b = temp;}while (1){if (b % a == 0){return a;}temp = b % a;b = a;a = temp;}
}
//输出是否是有补格
void complementedLattice(int arr[], int len,int n)
{for (int i = 0; i < len; i++){int flag = 0;for (int j = 0; j < len; j++){if(i == j){continue;}if (greatestCommonDivisor(arr[i], arr[j]) == 1 &&leastCommonMultiple(arr[i], arr[j]) == n){flag = 1;break;}}if (flag == 0){printf("不是有补格,%d没有补元", arr[i]);return;}}printf("是有补格");
}int main()
{int n = 0;printf("请输入一个不超过50的整数:\n");scanf("%d", &n);int arr[50] = { 0 };//用来储存正整数n的所有因子int len = factors(arr, n);//求n的因子,返回因子个数envelop(arr, len);//输出盖住关系complementedLattice(arr, len, n);return 0;
}