【问题标题】:C program to check whether a number is prime or notC程序判断一个数是否为素数
【发布时间】:2016-01-25 08:58:20
【问题描述】:

我使用了下面的代码,它显示像 49 这样的数字是素数而不是复合数。我是编程新手,所以请帮助我编写正确的代码。

#include <stdio.h>
int main()
{
    int n;
    int i;
    scanf ("%d", &n);
    for (i=2; i<n; i++)
    {
        if (n%i==0)
        {
            printf ("number is composite");
        }
        else
        {
            i=i+1;
        }  
    }
    printf("number is prime");
    return 0;

}

【问题讨论】:

  • 为什么不在调试器下运行呢?您可能会发现它为什么不检查某些数字,这将是一个非常有用的学习方法。
  • 删除其他部分。如果您的 if 条件匹配,则返回一些内容。

标签: c if-statement for-loop primes


【解决方案1】:

您可以按如下方式修改循环 -

 if(n%2==0 && n!=2){                   //if 2's multiple is entered no need of loop just check this
      printf("number is composite");
      return 2;                        // for sake I just returned 2 
   }             
 for (i=3; i<n;i=i+2)
{
    if (n%i==0)                              // if this is true 
    {
        printf ("number is composite");      // print this   
        return 1;                            // return from function no further iterations 
    } 
}

通过这种方式,您可以停止循环,因为if 条件是true 并且我们执行了它的块中的代码。

【讨论】:

  • 从 main 返回除零以外的任何值通常表示错误情况。另外,这可以优化,寻找潜在的除数到sqrt(n)就足够了。
  • @szczurcio 是的,循环可以修改为直到sqrt of n。它是通过0 表示成功的约定。我们必须返回任何东西,所以为什么不1
  • 一次被2检查,为什么还要检查2的倍数?
  • @wrangler 搞定了。
【解决方案2】:

当您发现数字是合数时,您并没有停止循环,因此合数会同时收到两条消息。

i 不是 n 的一个因子时,您将 1 添加到 i 但随后 for 循环再次添加 1。这意味着对于每个 不是 n 因子的数字,您都会跳过一个数字。

printf("number is prime"); 没有被任何类型的 if 包围,所以它总是会被打印出来,不管这个数字是否真的是素数。与人类不同,计算机在打印冲突信息时不会三思而后行,因为计算机无法解释我们让它们执行的操作。

您可以通过检查更少的数字来优化您的代码。只检查数字的平方根。

此代码未经测试,但应该可以工作。请注意,这仅消除了对平方根以上因子的检查,但任何先前检查的因子的倍数(例如,这样写,程序将检查该数字是否可以被 2 整除,也可以被 4 整除、6、8、10 等)。

#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    int i;
    int isComposite = 0;
    scanf ("%d", &n);
    for (i = 2; i <= (int)sqrt((double)n); i++){
        if (n % i == 0){
            printf ("number is composite");
            isComposite = 1;
            break;
        }
    }
    if (!isComposite){
        printf("number is prime");
    }
    return 0;

}

【讨论】:

  • 恐怕这段代码会说49 是素数。你想要i &lt;= sqrt(...) ;)
【解决方案3】:

结合所有建议和 cmets 给出:

int q= (int) sqrt(n);
if (n%2==0)
{
    printf ("number is composite");      // print this   
    return 1;                            // return from function no further iterations 
}
for (i=3; i<=q; i += 2)
{
    if (n%i==0)                              // if this is true 
    {
        printf ("number is composite");      // print this   
        return 1;                            // return from function no further iterations 
    } 
}

【讨论】:

    【解决方案4】:

    你得到 49 a s 的原因是因为这条线:

    else
    {
        i=i+1;
    }
    

    这会导致您在支票中跳过奇数,而 49 是 7*7,因此您得到的输出是素数。 您遇到的另一个问题是,当您获得一个合数时,您不会停止循环,并且在结束时您将调用这行代码,而不管循环中发生了什么。 printf("number is prime");

    这是一个更好的做法: 创建一个函数,如果它是素数,则返回 1,如果不是,则返回 0。 如果你意识到它是一个合数,你应该立即返回。如果你到达循环的末尾,它肯定是一个素数。 此外,您可以将循环运行到 n 的平方根以获得更少量的迭代,直到 n。 祝你好运

        int isPrime(int n)
        {
            int i;
            for (i = 2; i < (int) sqrt(n) ; i++)
            {
                if (n % i == 0)
                {
                    printf("number is composite");
                    return 0;
                }
            }
            printf("number is prime");
            return 1;
        }
    

    【讨论】:

      【解决方案5】:

      你应该删除 i=i+1 行,你已经在 for (i=2; i&lt;n; i++) 中增加 i

      之后,您必须将条件放在循环之后,以防止每次检查时打印结果。

      #include <stdio.h>
      int main()
      {
        int n;
        int i;
        scanf ("%d", &n);
        for (i = 2; i<n; ++i)
          {
            if (n%i==0)
              {
                printf ("number is composite, divisible by %d\n", i);
                break;
              }
            printf("i=%d\n", i);
          }
        if (n%i != 0)
          printf("number is prime\n");
        return 0;
      }
      

      【讨论】:

        【解决方案6】:

        你来了。

        #include <stdio.h>
        
        int main( void )
        {
            while ( 1 )
            {
                unsigned int n = 0;
                _Bool prime;
        
                printf( "\nEnter a non-negative number (0-exit): " );
                scanf( "%u", &n );
        
                if ( !n ) break;
        
                prime = n == 2 || ( n % 2 && n != 1 );
        
                for ( unsigned i = 3; prime && i * i <= n; i += 2 )
                {
                    prime = n % i;
                }            
        
                printf( "Number %u is %s\n", n, prime ? "prime" : "composite" );
            }
        
            return 0;
        }
        

        如果按顺序输入

        1 2 3 4 5 6 7 8 9 0
        

        那么输出是

        Enter a non-negative number (0-exit): 1
        Number 1 is composite
        
        Enter a non-negative number (0-exit): 2
        Number 2 is prime
        
        Enter a non-negative number (0-exit): 3
        Number 3 is prime
        
        Enter a non-negative number (0-exit): 4
        Number 4 is composite
        
        Enter a non-negative number (0-exit): 5
        Number 5 is prime
        
        Enter a non-negative number (0-exit): 6
        Number 6 is composite
        
        Enter a non-negative number (0-exit): 7
        Number 7 is prime
        
        Enter a non-negative number (0-exit): 8
        Number 8 is composite
        
        Enter a non-negative number (0-exit): 9
        Number 9 is composite
        
        Enter a non-negative number (0-exit): 0
        

        【讨论】:

          【解决方案7】:

          判断一个数是否为素数的另一种方法是:-`

          #include<stdio.h>
          
          void main()
          {
              int no,i;
              char x='y';
              printf("Enter a number : ");
              scanf("%d",&no);
          
           for (i=2;i<=no/i;i++)
               {
                 if(no%i==0)
                 {
                    x='n';
                    break;
                 }
               }
           if(x=='y')
              printf("The number is a prime number. ");
           else
              printf("The number is not prime number. ");
          }
          

          这里的逻辑是将测试用例的数量限制为(被测试的数量与循环计数器的值的商),因为除数不能超过这个商。

          【讨论】:

            【解决方案8】:
            #include <stdio.h>
            
            int main(){
                int intNumber=0;
                int intCount=0;
                printf("Enter Number :");
                scanf("%d",&intNumber);
            
                for(int i=1;i<=intNumber;i++){
                    if(intNumber%i==0){
                        intCount++;
                    }
                }
                if(intCount==2 && intNumber!=1){
                    printf("Number is prime");
                }else{
                    printf("Number is not prime");
                }
                return 0;
            }
            

            【讨论】:

            • 检查一个数字是否是素数
            • 您提供的代码是检查素数的非常糟糕的方法。此外,它无法解决 为什么 OP 的代码不起作用。
            猜你喜欢
            • 2010-12-05
            • 2016-02-10
            • 2011-05-24
            • 2015-02-08
            • 2013-11-05
            • 2020-02-14
            • 2017-03-05
            相关资源
            最近更新 更多