首页 > 解决方案 > 对于素数和非素数,程序没有按预期工作

问题描述

这段代码有什么问题?请帮助我我正在输入 9 它说这个数字是素数并且输出实际上是相反的条件......怎么样?

#include <stdio.h>
#include <conio.h>

int prime(int);

int main()
{
    int num,res;

    printf("\nENTER A NUMBER: ");
    scanf("%d",&num);
    res=prime(num);
    if(num==1)
    {
        printf("Neither Prime nor Composite\n");
    }
    else
    {
        if(res==0)
            printf("\n%d IS A PRIME NUMBER",num);
        else
            printf("\n%d IS NOT A PRIME NUMBER",num);
    }

    getch();
}

int prime(int n)
{
    int i,p;
    for(i=2;i<=n/2;i++)
    {
        if(n%i==0){
            p=0;
        } else {
            p=1;
        }

        return p;
    }

}

标签: cfunctionprimesdefinition

解决方案


return 语句存在于循环中

int prime(int n)
{
    int i,p;
    for(i=2;i<=n/2;i++)
    {
        if(n%i==0){
            p=0;}
        else{
            p=1;
      }
            return p;
    }

}

所以在循环的第一次迭代之后,函数退出了。该函数不检查任何其他除数。

例如,对于素数2,该函数给出了错误的结果。

当传递的参数等于例如时,该函数具有未定义的行为1

也主要是这种情况

if(res==0)
    printf("\n%d IS A PRIME NUMBER",num);

也是错误的,因为假定该函数为非素数返回 0。

该功能可以如下所示

int isprime( unsigned long long int x ) 
{ 
    int prime = x % 2 == 0 ? x == 2 : x != 1; 
      
    for ( unsigned long long int i = 3; prime && i <= x / i; i += 2 ) 
    { 
        prime = x % i != 0; 
    } 
      
    return prime; 
} 

另请参阅我的个人论坛C 函数中的参考,该函数确定一个数字是否为素数

虽然它是用俄语编写的,但您可以使用例如谷歌服务“翻译”将其翻译成英语。


推荐阅读