c - 与素数相关的输出

标签 c factors

下面只写了函数

素因子的函数

void prime(int x) {
    int i, j;             

写这个是因为它想要信息但没有任何信息

    for (i = 2; i <= x; i++) {
        if (x % i == 0) {
            for (j = 2; j <= i; j++) {
                if (i == j) {
                    printf("%d", i);
                } else
                if ((i % j) != 0) {
                    printf("%d\n", i);

输出应该是数字的素数,重复的素数也应该可以看到,所以通过乘法我们得到原始数字

                    goto l;

这里 goto 语句脱离了 if 循环

                } else {
                    break;
                }
            }
        l: 
            x = x / i;
        }
    }
}

代码似乎是正确的,也给出了质数,但这些因子并没有重复。

例如:24 输出应为 2,2,3 但输出为 2,3

最佳答案

goto 语句是无用的,它完全等同于您的案例中的 break 语句。它不会跳出 if 循环,它会跳出 for 循环,这正是 break 确实如此。

此外,内部循环是无用的:如果您将 x 除以 i,您实际上从 x 中删除了较小的素数,并且 x % i == 0 仅适用于 i 的素数。

输出中的问题来自这样一个事实,即使 xi 的倍数,您也会递增 i。因此,您只打印一次质因数,而不会从 x 中完全删除它。

函数因此可以简化为:

void primefactors(int x) {
    int i;             

    for (i = 2; i <= x;) {
        if (x % i == 0) {
            printf(" %d", i);
            x = x / i;
        } else {
            i++;
        }
    }
    printf("\n");
}

函数可以做得更快:当 i 大于 x 的平方根时可以停止扫描:

void primefactors(int x) {
    int i;             

    for (i = 2; i * i <= x;) {
        if (x % i == 0) {
            printf(" %d", i);
            x = x / i;
        } else {
            i += 1 + (i & 1);  // skip even numbers
        }
    }
    printf("%d\n", x);
}

关于c - 与素数相关的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46058083/

相关文章:

c - 将自定义 glibc 与 bazel 结合使用

Python;使用字典查找数字代码的因子。为什么这不起作用?

C++ - 成对显示的整数因子

r - ifelse 使因子 'forget' 成为其水平顺序

c++ - 如何计算递归函数?

java - 计算复杂度为 O(1) 的 N 以下数字的倍数之和?

c++ - 在定义结构之前如何使用指向结构的指针?

c - C中的内存替换?

c - 如果函数调用本身充当内存屏障,为什么 pthread_mutex_lock() 和 pthread_mutex_unlock() 包含内存屏障?

c - 理解汇编语言中的 teSTL