2

下面的代码是读取用户的输入以检查 int [1-100] 是否为质数。(如果超出范围,将打印“完成”。如果不是素数,将输出到控制台并且数字可整除。

现在这个程序在 1-10 上运行正常,除了 3 和 9...有什么建议吗?

#include <stdio.h>

int main()
{
    int num, i;
    printf("Number [1-100]:? \n");
    scanf("%d", &num);
    while(num>0 && num <101)
    {
        if (num==1||num==2)
            printf("Prime\n");
        for (i=2; i<=num/2; ++i)
        {
            if (num%i==0)
            {
                printf("Non-prime,divisible by %d\n",i);
                break;
            }
            else {
                printf("Prime\n");
                break;
            }
        }

        printf("Number[1-100]:? \n");
        scanf("%d",&num);
    }
    printf("Done\n");
}
4

3 回答 3

3

首先,确保您的代码有适当的空格。这将帮助您意识到事情没有像您想象的那样排列。

#include <stdio.h>

int main()
{
  int num, i;
  printf("Number [1-100]:? \n");
  scanf("%d", &num);
  while(num>0 && num <101){
    if (num==1||num==2)
      printf("Prime\n");
    for(i=2; i<=num/2; ++i)
    {
      if (num%i==0)
      {
        printf("Non-prime,divisible by %d\n",i);
        break;
      }
      else {
        printf("Prime\n");
        break;
      }
    }
     printf("Number[1-100]:? \n");
    scanf("%d",&num);
  }
  printf("Done\n");
}

现在您应该意识到您的 else 语句发生在第一次检查时!因此,当 3 不能被 2 整除时,它会打印“素数”。

然后它跳出循环。

这发生在每个数字上。你的程序所做的就是检查数字是否能被 2 整除。

如果你写的是“Odd”而不是“Prime”,那至少在那里是正确的。

这是设置标志可能有用的问题(还有其他方法可以做到这一点,但这是一种方法)。所以你可以设置一个标志,比如说int isPrime = 1;

现在,如果你发现这个数不是素数,你只需设置isPrime = 0;.

最后,在 for 循环结束时(让我重复一遍:for 循环结束后),您需要检查该变量。你可以说,

if (isPrime == 1)
{
  printf("Prime\n");
} else
{
  printf("Non-prime.");
}

我会让你弄清楚如何打印除数:)

(作为参考,正确使用标志看起来像这样——为了清楚起见,我删除了它连续循环的“功能”)

#include <stdio.h>

int main()
{
  int num, i;
  int isPrime = 1;
  printf("Number [1-100]:? \n");
  scanf("%d", &num);
  for(i=2; i<=num/2; ++i)
  {
    if (num%i==0)
    {
      isPrime = 0;
      break;
    }
  }
  if (isPrime == 1)
  {
    printf("Prime\n");
  } else
  {
    printf("Non-prime.");
  }
  printf("Done\n");
}
于 2013-09-12T21:35:12.627 回答
0

3表现不同的原因是for逻辑永远不会达到3。对于“(i = 2; i <= num / 2; ++ i)”,如果num等于3,则i(为2)为否长于 3/2,即 1(四舍五入后)。因此,您应该将“num==3”检查添加到“if (num==1||num==2)”。

于 2013-09-12T21:40:50.803 回答
0

您没有检查 2 到 num/2 之间的整个范围。您需要一个 while 循环和一个主要标志。像这样的东西。

    while(num>0 && num <101)
    {

        unsigned char prime = 1;    // set prime flag
        i = 2;
        while( i < (num/2)+1)
        {
            if(num%i == 0)
                prime = 0;
                i++;
            }
            if(num == 1)
            prime = 0;

        if(prime == 0)
            printf("%d is nonprime\n", num);
        else
            printf("%d is prime\n", num);

       prime = 1;
       printf("Number[1-100]:? \n");
       scanf("%d",&num);
    }
于 2013-09-12T22:02:31.060 回答