C程序判断一个数是否为质数

C program to check whether a number is prime or not

我使用了以下代码,它显示像 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(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 并且我们执行了其代码块中的代码。

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

i 不是 n 的因数时,您将向 i 加 1,然后 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;

}

综合所有建议和意见得出:

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

你得到 49 a s 复合的原因是因为这一行:

else
{
    i=i+1;
}

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

这里有一个更好的做法: 创建一个函数,如果它是素数,则 return 为 1,否则为 0。 如果你意识到这是一个合数,你应该立即return。如果你到达循环的末尾,它肯定是一个质数。 此外,您可以 运行 循环到 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;
    }

您应该删除 i=i+1 行,您已经在 for (i=2; i<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;
}

给你。

#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

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

#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. ");
}

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

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