c - 质因数之和

标签 c

我正在尝试显示给定数字的质因数之和 我在输出中显示主要因素时遇到困难。

示例输出:

Input number: 6
Factors are: 1 2 3
Sum of its factor: 1 +2 +3 =6

我能够显示总和,但我想显示 1+2+3=6,就像上面示例中的因数是 1 2 3 一样。

你能帮我纠正我的语法来实现这个吗?提前致谢。

这是我的代码:

#include <stdio.h>

int main() {
    int i, j, num, isPrime, sum;

    printf("Input number: ");
    scanf("%d", &num);

    printf("Factors are: ", num);

    for (i = 1; i <= num; i++) {
        if (num % i == 0) {
            isPrime = 1;
            for (j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    isPrime = 0;
                    break;
                }
            }

            if (isPrime == 1) {
                printf("%d ", i);
                sum += i;
            }
        }
    }

    printf("\nSum of its factor : %d", sum);
    return 0;
}

最佳答案

您的代码实际上具有未定义的行为,因为 sum 未初始化为 0。它只是偶然产生正确的总和。

您可以将因子存储在数组中,甚至可以在使用 sprintf 时构建表达式。表达式的最大长度不是很大,因为最多可以有 9 个不同的素因子 (29!! > 232)

修改后的版本:

#include <stdio.h>

int main() {
    char expr[9 * 11 + 1];
    int i, j, pos, num, isPrime, sum;

    printf("Input number: ");
    if (scanf("%d", &num) != 1)
        return 1;

    printf("Factors are: 1");  // always include 1
    pos = 0;
    expr[pos] = '\0';
    sum = 1;
    for (i = 2; i <= num; i++) {
        if (num % i == 0) {
            isPrime = 1;
            for (j = 2; j * j <= i; j++) {
                if (i % j == 0) {
                    isPrime = 0;
                    break;
                }
            }
            if (isPrime == 1) {
                pos += sprintf(expr + pos, "+%d", i);
                printf(" %d", i);
                sum += i;
            }
        }
    }

    printf("\nSum of its factors: 1%s = %d\n", expr, sum);
    return 0;
}

输出:

Input number: 6
Factors are: 1 2 3
Sum of its factors: 1+2+3 = 6

这是一个更健壮和更快的版本,对于非常大的 num 值没有未定义的行为:

#include <stdio.h>

int main() {
    char expr[9 * 11 + 1];
    int i, pos, num;
    unsigned sum;

    printf("Input number: ");
    if (scanf("%i", &num) != 1)
        return 1;

    printf("Factors are: 1");  // always include 1
    pos = 0;
    expr[pos] = '\0';
    sum = 1;
    for (i = 2; num / i >= i; i++) {
        if (num % i == 0) {
            pos += sprintf(expr + pos, "+%d", i);
            printf(" %d", i);
            sum += i;
            do { num /= i; } while (num % i == 0);
        }
    }
    if (num != 1) {
        pos += sprintf(expr + pos, "+%d", num);
        printf(" %d", num);
        sum += num;
    }
    printf("\nSum of its factors: 1%s = %u\n", expr, sum);
    return 0;
}

测试:

Input number: 0x7fffffff
Factors are: 1 2147483647
Sum of its factors: 1+2147483647 = 2147483648

关于c - 质因数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118734/

相关文章:

c - free() 为什么不需要长度参数?

c - 我的程序没有按预期工作

c - 我没有得到以下 C 语言的头文件

c - 如何用C实现多关键字搜索?

c - 在为链表实现追加函数时出现段错误

c - 结构上的 memcpy 错误

c - 如何制作 IIR 滤波器?

c - C中的单链表

从二维数组连接字符串

c - 在返回函数之前释放分配的内存