我尝试创建的程序应打印从键盘扫描的数字是否为质数。该程序应使用递归函数来确定数字是否为质数。我创建的程序没有编译问题。但是,当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直接插入函数的参数是否正确?

任何帮助表示赞赏!:)

最佳答案

建议的代码如下:


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


现在,建议的代码为:

#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;
}

关于c - C程序,使用递归函数确定数字是否为质数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58258626/

10-11 21:45