【问题标题】:program is not working as expected for prime and non prime [closed]对于素数和非素数,程序没有按预期工作[关闭]
【发布时间】:2019-10-02 11:14:33
【问题描述】:

这段代码有什么问题?请帮助我 我正在输入 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;
    }

}

【问题讨论】:

  • 当你发现数字不是质数时,你应该打破循环
  • 提示:在调用prime之前,您应该检查if(num==1)
  • 请一致地缩进您的代码。奇怪的、可变的缩进和大括号放置使其难以阅读。
  • @samini,实际上,他们过于频繁地打破循环 :) 当代码正确缩进时,这一点变得很明显,这就是这样做如此重要的原因。
  • 为什么是i&lt;=n/2?如果输入 n = 23,它永远不会评估它?

标签: c function primes definition


【解决方案1】:

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 function that determines whether a number is prime

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

【讨论】:

  • isprime() 对于大的x 可能会失败,因为x % i &gt; INT_MAX 是可能的。 IMO 一个简单的if (x % i) return 0; .... } return 1;(在处理偶数情况后)比使用prime 会更清楚。
  • @chux 写 prime = x % i != 0;
  • 很好的解决方法——解决方法很多
猜你喜欢
  • 2017-12-10
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多