【问题标题】:C - Print all prime numbers from 1 to 100 using arraysC - 使用数组打印从 1 到 100 的所有素数
【发布时间】:2018-12-29 17:04:58
【问题描述】:

好的,所以我遇到了这个挑战,我必须打印从 1100 的所有素数...但是我的代码中有一个我无法找到的错误。以下是我认为应该解决的问题:

  • 对于从 3 到 100 的任何数字,请检查素数数组中是否有任何其他数字将其除以。如果有这个数不是素数。如果没有这个数是素数,应该添加到数组中。很简单,对吧? 但是它不起作用。

这是我的代码:

#include <stdio.h>

int main() {
    int Primes[50] = {0};
    int i, j, k;

    Primes[0] = 2;
    Primes[1] = 3;
    for (i = 3; i < 101; i++) {
        for (j = 2; j < 100; j++) {
            if (i % Primes[j] != 0 && Primes[j] != 0) {
                Primes[j] = i;
            }
        }
    }
    printf("Primes array : \n");
    for (k = 0; k < 51; k++) {
        printf("%d ", Primes[k]);
    }
    return 0;
}

【问题讨论】:

  • for 循环约束似乎是错误的(尤其是内部循环)。你最好检查你的算法,搜索互联网......你的方法需要在内部 for 循环中使用(当然是递增的)第三个变量(主要计数器)。
  • 嗨,for(j=2;j&lt;100;j++) 后跟 Primes[j]=i; 会导致分段错误,因为 j 运行到 100 但您将 Primes 大小定义为 50,而且您已经将 Primes[0] 设置为零,所以 @ 987654327@ 应该是 Primes[1]=2; 下一行相同..
  • for(k=0;k&lt;51;k++) 应该是 for(k=0;k&lt;49;k++),因为数组索引从 0 开始

标签: c arrays syntax


【解决方案1】:

我们可以不假设幻数为 25...即 k!=25,而是 将其替换为 i

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int Primes[50] = {0};
    int i,j,k  = 0;
    Primes[0]=2;
    Primes[1]=3;

    for(i=0; i<=100; i++) {
        for(j = 2; j<=i; j++) {
            if(i % j == 0 ){
                if(i == j)
                    Primes[k++]=i;
                break;
            }
        }
    }

    printf("Primes array : \n");

    for(int index = 0;index < k; index++) {
        printf("%d\n", Primes[index]);
    }

    return 0;   
}

【讨论】:

    【解决方案2】:

    当你这样做时:

            if(i % Primes[j] != 0 && Primes[j] !=0)
            {
                Primes[j]=i;
            } 
    

    您的意思是“如果当前数不能被给定素数整除,则将给定素数替换为当前数”。这不是你想要的。

    你需要检查当前数是否不能被任何素数整除。因此,您需要遍历素数列表以确保您的数字不能被其中的任何一个整除,如果可以,则将该数字添加到列表的末尾。你可以这样做:

    int num_primes = 0;
    
    for (i=2;i<101;i++)
    {
        int is_prime = 1;
        for(j=0; j<num_primes && is_prime; j++)
        {
            if(i % Primes[j] == 0)
            {
                is_prime = 0;
            }
        }
        if (is_prime) {
            Primes[num_primes++] = i;
        }
    }
    

    在上面的代码中,我们使用num_primes 来计算到目前为止我们拥有的素数的数量,并使用is_prime 来查看我们是否找到了除以当前数字的素数。当您将每个数字除以素数时,如果余数为 0,则您知道该数字不是素数并将 is_prime 设置为 0。这也会导致内部循环立即退出。然后,如果is_prime 仍然设置在内循环的末尾,你有一个素数并将它添加到列表的末尾。

    您在打印循环中也有一个错误:

    for(k=0;k<51;k++)
    

    由于Primes 的大小为 50,因此最大有效索引为 49。因此将其更改为:

    for(k=0;k<50;k++)
    

    【讨论】:

      【解决方案3】:

      您使用的算法存在很多问题。使用这个简单的版本来解决代码中的问题。

      int main(void){
      
              int Primes[50] = {0};
              int i,j,k = 0 /* use for prime count purpose */;
              Primes[0]=2;
              Primes[1]=3;
              for(i=4 /* 3 is already stored */; k != 48; i++) { /* rotate loop until prime count doesn't reaches 48 */
                      for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
                              if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
                                      if(i == j)  /* if its a prime numbur j reaches upto i */
                                              Primes[k++]=i; /* store it */
                                      break; /* comes out of inner loop */
                              }
                      }
              }
              printf("Primes array : \n");
              for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
                      printf("%d ", Primes[index]);
              }
              return 0;
      }
      

      【讨论】:

        【解决方案4】:

        上面的代码实际上并没有给出我们想要的,但仍然是漂亮的代码。这是给出从 1 到 100

        的素数的编辑代码
        int main(void){
        
            int Primes[50] = {0};
            int i,j,k = 0 /* use for prime count purpose */;
            Primes[0]=2;
            Primes[1]=3;
            for(i=0 /* 3 is already stored */; k != 25; i++) { /* rotate loop until prime count doesn't reaches 48 */
                    for(j = 2; j<=i; j++) { /* i is the number you want to check whether its prime or not. SO rotate loop from 2 to "i" */
                            if(i % j == 0){ /* use i%j not i % Primes[j] as you want to check whether i is prime or not */
                                    if(i == j)  /* if its a prime numbur j reaches upto i */
                                            Primes[k++]=i; /* store it */
                                    break; /* comes out of inner loop */
                            }
                    }
            }
            printf("Primes array : \n");
            for(int index = 0;index < k; index++) { /* rotate k times not some random 51 times */
                    printf("%d\n", Primes[index]);
            }
            return 0;
        
        }
        

        【讨论】:

        • k != 25 中的幻数 25 不清楚。对于正在执行“1 到 100”的代码在某个地方有 100 的代码更有意义。考虑从n 派生的限制,如“从 1 到 n 的素数”
        • 我同意这很难理解.. 神奇的数字是 48,它没有给出我们想要的,所以我只更改了一些数字,直到我得到从 1 到 100 的素数。
        • 代替k != 25,代码可以使用Primes[k] &lt;= 100进行迭代,直到找到所有小于100的素数。然后打印除最后一个以外的所有内容。
        • 我希望看到更易于逻辑遵循的代码。但到目前为止,这是我发现的唯一完全符合我们要求的代码。也许我可以自己写,但我还没有时间去做那件事..
        猜你喜欢
        • 2011-07-09
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 2013-05-06
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多