素数从1到100 C

时间:2018-06-05 16:03:47

标签: c

我正在编写一个程序来查找从1到100的素数。请检查我的代码是否正确。当我运行我的代码时,素数不会被打印出来。请帮忙。

#include <stdio.h>
#include <conio.h>

int main()
{
    int i, j, flag, rem;
    flag=0;

    printf("2");
    for(i=3; i<=100; i++)
    {
        for(j=2; j<=i; j++)
        {
            rem = i%j;
            if(rem == 0)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            printf("%d", i);  
        }
    }
    getch();
    return 0;
}

5 个答案:

答案 0 :(得分:2)

你有几个问题

首先,for(j=2;j<=i;j++)循环应为for(j=2;j<i;j++),就好像j等于i,j % i == 0将始终为真

其次,你的标志变量没有做你认为它正在做的事情。正如HolyBlackCat所说,这是一个学习如何使用调试器来查看正在发生的事情的好机会。您需要重置flag变量,因为一旦找到单个复合数字,您的标志将不会重置,因此所有后续数字都将标记为复合。添加:

for(i=3;i<=100;i++)
{
    flag = 0;
    for(j=2;j<=i;j++)
    {

答案 1 :(得分:2)

for (j = 2; j <= i; j++)更改为for (j = 2; j <= i/2; j++)。您需要循环到i/2

int main()
{
    int i, j, flag, rem;
    printf("2\n");
    for (i = 3; i <= 100; i++)
    {
        flag = 0;
        for (j = 2; j <= i/2; j++)
        {
            if (i % j == 0)
            {
                flag = 1;
                break;
            }
        }
        if (flag == 0)
            printf("%d\n", i);
    }
    getch();
    return 0;
}

答案 2 :(得分:2)

为了阅读目的,最好有正确的缩进。我在行中添加了一些注释,您可以优化代码,并删除了不必要的&#39; printf&#39;。 (\ t是在打印之后写一个标签空间)

#include <stdio.h>
#include <conio.h>
int main()
{
    int flag;
    printf("Prime numbers:  2\t");
    for(int i = 3; i <= 100; i++) // You can declare a temporal variable for the cycle
    {
        flag = 0; // reset the flag variable to zero when adding a new number
        for(int j = 2; j < i; j++) 
        {
            if(i%j == 0) // substitute the 'rem' variable for an operation
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0) 
        {
            printf("%d\t", i);  
        }
    }
    getch();
    return 0;
}

预期输出为:

Prime numbers:  2       3       5       7       11
13      17      19      23      29      31      37
41      43      47      53      59      61      67
71      73      79      83      89      97

答案 3 :(得分:1)

每次尝试新号码时,都应将flag重置为0。保留这样的代码,一旦数字不是素数,代码将永远不会再打印。

[...snip...]
for(i=3;i<=100;i++)
{
    flag = 0;
    for(j=2;j<=i;j++)
    {
[...snip...]

答案 4 :(得分:1)

问题是flag未正确设置/重置。而且代码还有很大的改进空间。

  1. 因为你已经打印2作为素数所以不需要检查其他甚至没有,因为2是唯一的甚至没有是素数。
  2. 我们可以检查2..n-1
  3. ,而不是将表单2..n/2分开

    找到以下优化代码:

    // return 1 if no is prime else 0
    int is_prime(int n)
    {
      for(int i = 3; i<= n/2; i+=2){
        if (n%i == 0)
        {
          return 0;
        }
      }
      return 1;
    }
    
    int main()
    {
      printf("2\n");
      for(int i=3; i<=100; i+=2)
      {
         if (is_prime(i))
        {
          printf("%d\n", i);
        }
      }
      return 0;
    }