求助:用C语言实现指定逐列相乘逻辑生成整数所有因数
C语言实现指定逻辑生成整数所有因数
以下是严格遵循你指定逻辑的实现方案,包含质因数分解后的因数生成与去重逻辑:
核心实现步骤
- 初始化因数列表为
[1] - 遍历质因数分解得到的每个质因数
- 对当前已生成的所有因数,分别与当前质因数相乘,生成候选因数
- 检查候选因数是否已存在于列表中,去重后添加至列表
- 遍历完所有质因数后,列表即为该整数的全部因数
完整代码实现
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 检查数值是否已在数组中,用于去重 bool isDuplicate(int *arr, int length, int target) { for (int i = 0; i < length; i++) { if (arr[i] == target) { return true; } } return false; } // 质因数分解:返回质因数数组,参数length保存数组长度 int* getPrimeFactors(int n, int *length) { int *factors = (int*)malloc(100 * sizeof(int)); *length = 0; // 提取所有2的因子 while (n % 2 == 0) { factors[(*length)++] = 2; n /= 2; } // 提取奇数因子 for (int i = 3; i * i <= n; i += 2) { while (n % i == 0) { factors[(*length)++] = i; n /= i; } } // 剩余大于2的数本身是质数 if (n > 2) { factors[(*length)++] = n; } return factors; } // 生成所有因数:输入质因数数组,返回因数数组,参数factorLen保存因数数量 int* generateAllFactors(int *primeFactors, int primeCount, int *factorLen) { int *factors = (int*)malloc(200 * sizeof(int)); *factorLen = 0; // 初始化因数列表为[1] factors[(*factorLen)++] = 1; // 遍历每个质因数 for (int i = 0; i < primeCount; i++) { int currentPrime = primeFactors[i]; int currentFactorCount = *factorLen; // 记录当前因数数量,避免遍历新增元素 // 用当前质因数与已有因数逐一相乘 for (int j = 0; j < currentFactorCount; j++) { int newFactor = factors[j] * currentPrime; // 去重后添加 if (!isDuplicate(factors, *factorLen, newFactor)) { factors[(*factorLen)++] = newFactor; } } } return factors; } // 测试入口 int main() { int num; printf("输入目标整数:"); scanf("%d", &num); int primeLen; int *primes = getPrimeFactors(num, &primeLen); printf("质因数分解结果:"); for (int i = 0; i < primeLen; i++) { printf("%d ", primes[i]); } printf("\n"); int factorLen; int *allFactors = generateAllFactors(primes, primeLen, &factorLen); printf("所有因数:"); for (int i = 0; i < factorLen; i++) { printf("%d ", allFactors[i]); } printf("\n"); // 释放动态分配的内存 free(primes); free(allFactors); return 0; }
代码说明
isDuplicate:实现去重逻辑,避免重复添加相同因数getPrimeFactors:你的质因数分解模块,这里保留完整实现供直接使用generateAllFactors:核心逻辑模块,严格按照你要求的步骤生成因数,无需额外在质因数数组前加1(初始的1等价于你说的前置元素)- 动态数组分配:为避免空间不足,初始分配了足够大的内存,实际使用中可根据需求优化
测试示例
输入12时,质因数分解结果为2 2 3,生成的所有因数为1 2 4 3 6 12(顺序因遍历逻辑略有差异,但包含全部因数)
内容的提问来源于stack exchange,提问作者Guilherme Moura Oliveira
相关产品推荐
相关产品推荐

