使用递归来查找素数

时间:2015-10-15 01:35:17

标签: c

该代码用于检查用户输入的号码是否为素数。我正在cygwin终端上执行程序,每当我运行它并输入一个数字时,它会说:“Segmentation fault(core dumped)”。有什么建议吗?

#include <stdio.h>

int prime(int num, int i, int count);

void main()
{
    int num, i=2, count=0, result;

    printf("Please enter a number: ");
    scanf("%d", &num);

    result = prime(num, i, count);

    if (result != 0)
        printf("num is not a prime number");
    else
        printf("num is a prime number");
}

int prime(int num, int i, int count)
{
    if (i < num)
    {
        if (num%i == 0)
        {
            count++;
            prime(num, i++, count);
        }
        else
            prime(num, i++, count);
    }
    return count;
}

3 个答案:

答案 0 :(得分:4)

您在函数参数中使用帖子increment i++。绝对没有任何作用。因为后增量在执行后发生。 因此,您的i变量永远不会增加,并进行无限递归,从而为您提供segmentation fault

您可以使用预先增加++i或使用i+1调用函数来修复它。

int prime(int num, int i, int count)
{
    if (i < num)
    {
        if (num%i == 0)
        {
            count++;
            prime(num, ++i, count);
        }
        else
            prime(num, ++i, count);
    }
    return count;
}

答案 1 :(得分:2)

分段错误是一种特殊的错误,它是由访问“不属于你”的内存引起的。它是一种帮助机制,可以防止破坏内存并引入难以调试的内存错误。每当你得到一个段错误时,你就知道你正在做一些错误的内存 - 访问已经被释放的变量,写入内存的只读部分等。在大多数语言中,分段错误本质上是相同的,让你搞砸了在内存管理方面,C和C ++中的段错误没有任何主要区别。

有很多方法可以获得段错误,至少在C(++)等低级语言中。获取段错误的常用方法是取消引用空指针:

更好地浏览这些链接: What is a segmentation fault?

what is Segmentation fault (core dumped)?

答案 2 :(得分:0)

<块引用>

使用递归打印质数

公共类 PrimeNumberUsingRecursionFun {

static int count = 0, i = 1, j = 1, n = 2;

public static void prime() {
    if (i < 100) {
        if (n % j == 0) {
            count++;
            j++;

        }  else if (count == 2 && j > n) {
            System.out.print(n + "  ");
            n++;
            j = 1;
            count = 0;
            i++;
        }
        else if (count == 1 && j < n) {
            j++;
        }
        else if(count >= 2) {
            j = 1;
            count  = 0;
            i++;
            n++;

        }
        prime();
    }


}

public static void main(String[] args) {
    prime();
}

}