首页 > 解决方案 > 为什么它显示主要因素的错误输出?

问题描述

我制作了这个程序来查找数字的素数,但是当我运行这段代码时,它给出了错误的输出。我已经调试了这段代码,逻辑也是正确的。我发现,当“x == 1”时,程序行为不端。我无法找到答案。

#include<stdio.h>
void prime(int );
main()
{
    int num;

    printf("Enter a number to find its prime factors: ");
    scanf("%d", &num);

    printf("\nPrime factors of %d are: \n", num);

    prime(num);
}

void prime(int x)
{
    int i = 2;

    while(x != 1)
    {
        if(x % i == 0)
        {
            printf("%d, ", i);

            x = x / i;
            prime(x);
        }

        else
        {
            i++;
        }

    }
}

标签: crecursionwhile-loopfactorsprime-factoring

解决方案


一旦找到第一个除数,就应该从循环中中断。否则,您的外部方法调用将继续搜索您的除数,x即使不再需要它:

void prime(int x) {
    if (x == 0) {
        printf("All prime numbers are prime factors of 0");
        return;
    }

    if (x == INT_MIN) {
        printf("Please provide a number larger than %i", INT_MIN);
        return;
    }

    x = abs(x);
    int i = 2;
    while(x != 1) {
        if(x % i == 0) {
            printf("%d, ", i);

            x = x / i;
            prime(x);
            break; // break here
        }
        i++;
    }
}

更新

但是,这里实际上不需要递归 - 相反,您可以使用如下简单的迭代算法:

void prime(int x) {
    if (x == 0) {
        printf("All prime numbers are prime factors of 0");
        return;
    }

    if (x == INT_MIN) {
        printf("Please provide a number larger than %i", INT_MIN);
        return;
    }

    x = abs(x);
    int i = 2;
    while (x != 1) {
        if (x % i == 0) {
            printf("%d, ", i);
            x = x / i;
        }
        i++;
    }
}

推荐阅读