【问题标题】:C++ all prime numbers function not workingC ++所有素数功能不起作用
【发布时间】:2017-11-09 07:34:19
【问题描述】:

所以我在编程方面真的很陌生,我在乱搞,决定尝试编写一个 Prime 生成器。这个想法是用户输入计算机应该检查素数的最大数量,并输出一个包含所有素数的文本文件。 所以我写了这段代码。

#include <iostream>
#include <string>
#include <Windows.h>
#include <fstream>

using namespace std;
int isPrime(int num) {
    for (int a = 1; a <= num/2; a++) 
        if (num % a == 0)
            return 0;
    return 1;
}


int main() {
    ofstream out_data("primes.txt");
    std::string name;
    int quantity;
    int maximum = 1000000;
    std::cout << "What is your name ?\n";
    getline(std::cin, name);
    std::cout << "What is the biggest number you want to get as a prime " << name << "? Please note that the maximum is " << maximum <<" \n";
    std::cin >> quantity;
    if (quantity <= maximum) {
        for (int b = 1; b < quantity; b++) {
            if (isPrime(b) == 1) {
                std::cout << b << "\n";
                out_data << b << "\n";
            }
        }
        std::cout << "The computer has finished calculating primes. Please check your folder for a .txt file.";
        Sleep(60000);
    }
    if (quantity > maximum) {
        std::cout << "Oh, i'm sorry. The computer can not calculate till " << quantity << ".";
        Sleep(15000);
    }
    return 0;
}

文件和控制台只显示数字 1。我花了一些时间试图找出代码有什么问题,但一无所获。在我看来,for循环会重复自己,if语句会重复,直到b

【问题讨论】:

  • 有趣的是,您将maximum 设置为 100 万。假设一个 32 位整数,你的最大值应该在 21 亿左右,你应该使用INT_MAX
  • 还可以尝试将函数isPrime 声明为bool。然后你会写return false; //instead of return 0return true; //instead of return 1。在你的 if 语句中你可以写if(isPrime(b))。请注意,您也可以这样编写 if 语句而无需更改,因为在 C++ 中,除 0 之外的每个整数值都计算为 true。
  • 在每次迭代时运行此函数,以查看当前迭代的数字是否为素数:Determining if a number is prime

标签: c++ input output


【解决方案1】:

您应该从2 而不是1isPrime 中开始循环。每个整数都等于0 mod 1

【讨论】:

    【解决方案2】:

    我相信您的问题在于您的 isPrime 功能。由于任何 num % 1 = 0,当 a = 1 时 for 循环的第一次迭代将始终捕获 if 语句。 用 a = 2 开始你的 for 循环。

       int isPrime(int num) {
            for (int a = 2; a <= num/2; a++) 
                if (num % a == 0)
                    return 0;
            return 1;
        }
    

    由于 num / 2 = 0,当 num = 1 时永远不会进入 for 循环。因此,您的 isPrime() 函数将返回 1 并让它输出。其他所有的nums都会进入for循环并返回0。

    【讨论】:

    • 天哪!我不敢相信我没有看到它。但是为什么输出是 1 而不是从 0 到 x 的所有数字?
    • 因为您的函数返回 0,并且您仅在将数字视为素数时才写入输出。它没有以这种形式出现。
    • 由于 num / 2 = 0,当 num = 1 时永远不会进入 for 循环。因此,您的 isPrime() 函数将返回 1 并让它输出。所有其他 nums 将进入 for 循环并返回 0。(编辑原始答案以包括此)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多