事实上,我的老师已经通过了计算从1到N的素数的程序,但是我不理解代码中的一些内容,我想帮忙。
在第18行中,我们有如下:for(j=2; j<=i/2; j++),因为j除以2?为什么J从2开始?我和J不应该从1开始?

#include <stdio.h>

int main() {
    int i, j, n, isPrime; //isPrime is used as flag variable

    /* Reads upper limit to print prime */
    printf("Find prime numbers between 1 to : ");
    scanf("%d", &n);

    printf("\nAll prime numbers between 1 to %d are:\n", n);

    /* Finds all Prime numbers between 1 to n */
    for(i=2; i<=n; i++) {
        /* Assume that the current number is Prime */
        isPrime = 1;

        /* Check if the current number i is prime or not */
        for(j=2; j<=i/2; j++) {
            /*
             * If i is divisible by any number other than 1 and self
             * then it is not prime number
             */
            if(i%j==0) {
                isPrime = 0;
                break;
            }
        }

        /* If the number is prime then print */
        if(isPrime==1) {
            printf("%d is Prime number\n", i);
        }
    }

    return 0;
}

最佳答案

不应该启动i…在1号?
是的,i应该在1处。考虑到当前代码将不断发展后面的代码可能如下所示。注意注释和代码与合同“1到n之间的数字”匹配。从2开始没有隐含的捷径,但是代码正确地测试了所有数字。

/* Finds all Prime numbers between 1 to n */
for(i=1; i<=n; i++) {
  if (IsPrime(i)) {
    printf("%d is Prime number\n", i);
  }
}

关键是作为一个程序员,你被赋予了“寻找1到n之间的素数”的任务。一个常见的子任务是编写[1...N]。当然,如果你把所有东西都编码在一起,bool IsPrime(int i)可以从i开始-我们知道2不是素数。然而,好的编程始于软件架构,这涉及到分而治之。因此,创建一个独立的helper函数来处理所有输入是一个很好的第一步。
不应该启动1在1号?
不,现在代码进入find-a-prime算法,启动j将失败。
bool IsPrime(int i) {
  if (i <= 1) return false;  // Cope with negative, 0, and 1.

  for (int j=2; j<=i/2; j++) {
    if (i%j==0) {
      return false;
    }
  }
  return true;
}

当然,我们可以在很多方面优化j=1

关于c - 寻找介于1和N之间的质数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37077459/

10-09 17:22