我不明白CS50 Prime

1zmg4dgp  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(123)

考虑第1讲中的 PrimeCS50)。
我需要找到从1到100的素数,使用:

  • 练习使用 for 循环
  • 使用模
  • 创建布尔函数

我已经意识到如何解决这个问题,我错在哪里,但我不明白为什么。

#include "cs50.h"
#include <stdio.h>

bool prime(int number);

int main(void)
{
    int min;
    do
    {
        min = get_int("Minimum: ");
    }
    while (min < 1);

    int max;
    do
    {
        max = get_int("Maximum: ");
    }
    while (min >= max);

    for (int i = min; i <= max; i++)
    {
        if (prime(i))
        {
            printf("%i\n", i);
        }
    }
}

// Print only prime numbers in the range.
// It takes in int number, and outputs bool true or false

bool prime(int number)
{
    // 1 is not prime, 2 is prime
    if (number < 2)
    {
        return false;
    }

    for (int i = 2; i < number; i++)
    {
        // not prime
        if (number % i == 0)
        {
            return false;
        }

        // is prime
        else
        {
            return true;
        }
    }
    return number; // has an output
}

这是我最初的答案,但它只是打印奇数。我的程序在移除

// is prime
        else
        {
            return true;
        }

但我真的不明白。为什么?

ekqde3dh

ekqde3dh1#

我的程序在删除else { return true; }后工作
我真的不明白为什么,有人能解释一下吗?
考虑下面的for循环。在第一次迭代中,当number % i == 0为true且false为true时,code * 返回 *。

for (int i = 2; i < number; i++) {
        // not prime
        if (number % i == 0) {
            return false;
        }
        // is prime
        else { 
            return true;
        }

       // Code never reaches this point.
    }

通过移除第二返回路径,循环可以再次迭代。

其他改进

  • 不需要迭代[2...number)。约为number的平方根就足够了。代码从O(n)到O(sqrt(n))-快得多。
  • 容易处理所有偶数作为特例。然后我们的循环运行2x。
bool prime(int number) {
    if (number % 2 == 0) {
      return number == 2;
    }

    for (int i = 3; i <= number/i; i += 2) {
        if (number % i == 0) {
            return false;
        }
    }
    return number > 1;
}
ovfsdjhp

ovfsdjhp2#

素数的技术定义是一个有两个倍数的数字,它们是1和它本身。要检查某个数字是否是质数,您可以循环遍历减去测试数字的所有数字,然后尝试将测试数字除以这些数字中的每一个,并检查余数。如果余数为0,则中断并返回函数的false。下面是一个简单的C实现。

// Import the libraries at the top of the file
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

bool isPrime(int k) {
  // Initialize a return type
  bool prime = true;

  // 0 and 1 are already disqualified
  if(k==0 || k==1) {
    return false;
  }
  else {
    // Check from 2
    for(int i=2; i<k; i++) {

      // Divide the test number with the numbers less than it
      if(k%i == 0) {
        // 'k' is not prime, update return type and break
        prime = false;
        break;
      }
    }
    // Return a true or false to the calling function
    return prime;
  }
}

要得到所有小于100的素数,你需要一个循环和我们上面实现的函数。

int main() {
  // Define a variable to count how many prime numbers you have so far
  int counter = 0;

  // Loop from 0 to 200 and print the numbers
  for(int i=0; i<200; i++) {
    // If 'counter' is equal to 100 then we are done
    if(counter == 100) {
      break;
    }

    // Use the prime function to check
    if(isPrime(i)) {

      // Increment the counter
      counter += 1;

      // Print the number to the console
      printf("%d\n", i);
    }
  }

  // Return an exit code to the operating system
  return 0;
}

相关问题