實驗要求
求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;
}