2016-01-18 61 views
1

所以我需要编写一个递归函数来验证数字是否是质数。 该算法非常简单,工作正常,只是当我打印的功能,而不是显示1或0时,它显示随机废话(也许地址?),我找不到原因。一个简单的递归函数打印奇怪的东西

代码:

int isPrimal(int n, int p) { 
    if (p == 1) { 
     return 1; 
    } 
    if (n % p == 0) { 
     return 0; 
    } 
    isPrimal(n, p - 1); 
    printf("n = %d i = %d\n", n, p);  
} 

int main() { 
    int numcase, *A, sizeA = 0, i = 0, cnt3dig = 0, n, p; 

    printf("Enter a number to check for primality\n"); 
    scanf("%d", &n); 
    p = (n - 1); 
    printf("The result is 1 if the number is a prime, 0 otherwise\n"); 
    isPrimal(n, p); 
    printf("The result is %d\n", isPrimal); 
} 
+0

为什么你忽略'scanf()'的返回值。如果''n'没有在'scanf()'初始化,你将永远不会知道并在'p =(n-1)'处使用它,这使得'p'内容不确定,然后调用'isPrimal()'。 –

+0

我看到的答案(其中两个)解决了你的第一个问题,但你很快就会发现更多。你的函数并不总是返回一个值,所以你有时会返回垃圾。这也是确定数字素数的极其低效的方法。我不确定你可以安全地使用它,即使是最大的32位有符号整数,更不用说更大的了。 –

回答

3

正在打印的isPrimal()函数的地址,你应该将其更改为

printf("The result is %d\n", isPrimal(n, p)); 

,不要忘记检查scanf()的返回值。

3

mainprintf调用未定义的行为,因为你传递给函数isPrimal而不是其结果的地址:变化printf("The result is %d\n", isPrimal);

printf("The result is %d\n", isPrimal(n, p)); 

而且,你的算法是非常低效的。函数isPrimal以递归方式调用n-2次。如果您删除printf语句,编译器会注意到自己的尾部调用,并将此递归转换为循环。如果您有printf声明,则无法执行此操作,对于较大的n值,您可能会过度沉重并导致Stackoverflow

1
There are 2 changes that are necessary 

1.在main中,在打印输出时,调用一个函数 - 不是对函数的位置的引用。 2.在isPrimal中,在print语句后递归调用isprimal。

#include<stdio.h> 
#include<stdlib.h> 
    int isPrimal(int n, int p) { 
    if (p == 1) { 
     return 1; 
    } 
    if (n % p == 0) { 
     return 0; 
    } 
    printf("n = %d i = %d\n", n, p); 
    isPrimal(n, p - 1); 
} 

int main() { 
    int numcase, *A, sizeA = 0, i = 0, cnt3dig = 0, n, p; 

    printf("Enter a number to check for primality\n"); 
    scanf("%d", &n); 
    p = (n - 1); 
    printf("The result is 1 if the number is a prime, 0 otherwise\n"); 

    printf("The result is %d\n", isPrimal(n, p)); 
    return 1; 
}