C程序,使用递归函数确定数字是否为质数

时间:2019-10-06 15:16:22

标签: c function recursion primes

我尝试创建的程序应该打印从键盘扫描的数字是否为质数。该程序应使用递归函数来确定数字是否为质数。我创建的程序没有编译问题。但是,当main()函数调用用于确定数字是否为质数的函数(我称此函数为质数)时,似乎返回从键盘扫描的整数始终为质数。质数和非质数都是这种情况。我创建的程序如下所示:

#include <stdio.h>
//function for determining whether a number is prime or not
int isprime(int i, int n){
    i = 2; 
    if(n > 1){
        /* i = 2, i is the divisor that checks whether n (the number
        being checked for being prime) is in fact prime */
        if(n % i == 0){
            return 1; 
        }
        /* recursive step that returns function with increased value
        of i */
        isprime(i + 1, n);
    }
    else {
        return 0;
    }
    return -1;
}

int main(){
    int x;
    //scans integer from the keyboard
    scanf("%d", &x);
    //calls recursive function 
    if(isprime(2, x) == 1){
        printf("%d is prime\n", x);
    }
    if(isprime(2, x) == 0){
        printf("%d is not prime\n", x);
    }
    return 0;
}

最后一个问题:正在像我的程序中那样调用递归函数:

 isprime(2, x) 

使用正确的语法?将数字2直接插入函数的参数是否正确?

感谢您的帮助!:)

4 个答案:

答案 0 :(得分:0)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 检查并处理I / O错误
  4. 将评论纳入OP问题
  5. 颠倒了返回值0或1的含义,以便于计算
  6. 正确实现一种递归算法,包括边缘情况和停止条件
  7. 通过将“ n”的平方根用作参数“ i”的限制因素,可以大大限制递归深度
  8. 使用“无符号”值来避免负数的复杂性

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>


int isprime( unsigned i, unsigned n )
{
    if( n < 2 )
    { // cannot be prime
        return 1;  
    }

    if( i >= n )
        return 0;

    if(n % i == 0)
    {  // then, not prime
        return 1; 
    }

    return isprime(i + 1, n );
}

int main( void )
{
    unsigned x;
    if( scanf("%u", &x) != 1 )
    {
        fprintf( stderr, "scanf failed\n" );
        exit( EXIT_FAILURE );
    }

    // implied else, scanf successful

    if( !isprime(2, x ) )
    {
        printf("%d is prime\n", x);
    }
    else
    {
        printf("%d is not prime\n", x);
    }
    return 0;
}

答案 1 :(得分:0)

示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int is_prime(int n, int div)
{
    if (n <= 1)
        return 0;
    else if (div <= 1)
        return 1;
    else if (n % div == 0)
        return 0;
    return is_prime(n, --div);
}

int main()
{
    for (int i = 0; i < 100; i++)
    {
        printf("%d is %s\n", i, is_prime(i, (int)(sqrt(i)))? "prime":"not prime");
    }

    return 0;
}



您需要传递的两个参数是要检查的数字及其平方根。您不需要检查大于此的数字,因为如果您考虑一下,实际上就没有必要。

例如,如果您的电话号码是16,则只需要检查1到4之间的数字即可。这种情况很难解释,因此请参见下表:

1*16
2*8
4*4
8*2 <----- We already checked this!!
...



希望这会有所帮助!

答案 2 :(得分:0)

我建议您在一般的https://www.sub.foo.com/函数中处理参数测试(负输入)和特殊情况(偶数甚至是2以外的数字),但是一旦数据干净,就将计算移到集中的{{1 }}函数,避免重复测试:

is_prime()

答案 3 :(得分:0)

这是我创建的程序,该程序使用递归函数确定数字是否为质数!程序中的注释解释了每个部分!希望这对尝试创建类似程序的人有所帮助!

#include <stdio.h>
// i = divisor
// n = number being checked for being prime
int isprime(int i, int n){
    //base case one: 1 is not prime
    if (n == 1){
        return 0;
    }
    //base case two: 2 is prime 
    if (n == 2){
        return 1;
    }
    //if i is a divisor then n not prime 
    if (n % i == 0){
        return 0;
    }
    /* if root of n is reached while trying 
    to find a divisor but no divisor found, so 
    no previous return, then we have a prime number */
    if (i * i > n){
        return 1;
    }
    //recursive step, trying next value as divisor
    return isprime(i + 1, n);
}

int main(){
    int x;
    scanf("%d", &x);
    if(isprime(2, x) == 1){
        printf("%d is prime\n", x);
    }
    if(isprime(2, x) == 0){
        printf("%d is not prime\n", x);
    }
    return 0;
}

该程序的输入如下:

3 

该程序的输出如下:

3 is prime