我不明白:cs50素数

oalqel3c  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(113)

https://cs50.harvard.edu/x/2023/problems/1/prime/
从讲座1
我需要找到素数从1-100通过使用
练习使用forloop
使用模
创建布尔函数
我已经意识到如何解决这个问题,我错在哪里,但我不明白为什么。

#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
// takes in int number, output bool T/F

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;
        }

但我不知道为什么,有人能解释一下吗?谢谢。

7vux5j2d

7vux5j2d1#

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

cyvaqqii2#

一个质数的技术定义是一个有两个倍数的数字,它们是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的素数,那么你需要一个loo和我们上面实现的函数。

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 OS
  return 0;
}

相关问题