与素数相关的输出

时间:2017-09-05 14:59:22

标签: 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);

输出应该是数字的素数,并且应该看到重复的素数no.s,因此通过多重化我们得到原始数字

                    goto l;

此处goto语句取消if循环

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

代码似乎是正确的,并且也给出了素数,但是因素并没有重复。

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

2 个答案:

答案 0 :(得分:1)

goto语句没用,它完全等同于你的break语句。它没有突破if循环,它突然出现for循环,这正是break所做的。

此外,内部循环是无用的:如果将x除以i,则可以有效地从x中移除较小的素数,而x % i == 0仅适用于素数值i

输出中的问题来自于即使ix的倍数,您也会增加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);
}

答案 1 :(得分:0)

我的解决方案。如果需要,我可以添加评论。

#include <stdio.h>

void prime_factors(int num) {
    int i = 2;
    while(num > 1) {
        while(num % i == 0) {
            num /= i;   
            printf("%d ", i); 
        }   
        i++;
    }   
}

int main() {
    int num;

    while(1) {
        printf("%s", "Enter the number: ");

        if(scanf("%d", &num) != 1)  
            break;

        // \033[1;31m - changes text color to red
        // \033[0;0m  - resets color back to default
        // It works on Linux, I don't know about Windows.
        if(num <= 1) {
            puts("\033[1;31mThe number must be greater than 1.\033[0;0m");
            continue;
        }   
        puts("Prime factors are:");

        prime_factors(num);

        puts("\n");
    }   

    return 0;
}

<强>测试

Enter the number: 24
Prime factors are:
2 2 2 3 

Enter the number: 12
Prime factors are:
2 2 3 

Enter the number: 1000
Prime factors are:
2 2 2 5 5 5