素数检查1-100(C)

时间:2013-09-12 21:29:15

标签: c primes

以下代码是读取用户的输入以检查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");
}

3 个答案:

答案 0 :(得分: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");
}

现在您应该意识到您的其他声明会在第一次检查时发生!因此当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");
}

答案 1 :(得分:0)

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

答案 2 :(得分: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);
    }