You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:05:32