C程序检查数字是否为素数

时间:2015-10-26 09:50:35

标签: c if-statement for-loop primes

我使用了以下代码,它显示了像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;

}

7 个答案:

答案 0 :(得分:2)

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

 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且其块中的代码执行时,您将停止循环。

答案 1 :(得分:2)

当您发现该数字是复合数字时,您没有停止循环,因此复合数字会同时获得这两个消息。

如果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;

}

答案 2 :(得分:1)

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

答案 3 :(得分: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 
    } 
}

答案 4 :(得分:0)

你获得49个复合词的原因是因为这一行:

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 :(得分:0)

你在这里。

character

如果要按顺序输入

#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

答案 6 :(得分:0)

查找数字是否为质数的另一种方法可以是:-`

equals

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