为什么 break 不够好?

Why isn't break good enough?

C++

当我第一次 运行 使用不同的输入值 881、643、743 等...这些都是素数时,我得到的结果是“真”,但是当我输入一个更高的数字,如 804047277,当它应该是“假”时返回为“真”

#include <iostream>

int main(){

    int num;

    std::cin >> num;

    for(int i = 2; i < num; i++){
        if(num % i == 0){
            std::cout << "True" << std::endl;
            break;
        }
        else{
            std::cout << "False" << std::endl;
            break;
        }
    }
    return 0;
}

我更正了我的代码(下面的代码)并收到了正确的答案,即“错误”

#include <iostream>

int main(){

    int num;

    std::cin >> num;

    for(int i = 2; i < num; i++){
        if(num % i == 0){
            std::cout << "True" << std::endl;
            break;
            return 0;
        }
        else{
            std::cout << "False" << std::endl;
            break;
        }
    }
    return 0;
}

if 语句中的 break 不应该停止整个循环吗?我只是想了解为什么休息时间不够好,我不得不 return 0;

我会像下面这样更正您的代码(见后面的描述):

Try it online!

#include <iostream>

int main() {
    int num = 0;
    std::cin >> num;
    
    for (int i = 2; i < num; ++i)
        if (num % i == 0) {
            std::cout << "True (Composite)" << std::endl;
            return 0;
        }

    std::cout << "False (Prime)" << std::endl;
    return 0;
}

输入:

804047277

输出:

True (Composite)

因为很容易理解,您的程序旨在检查 primality and compositness 个数字。

您的程序中的错误是当除以第一个 i 得到 non-zero 余数时,您显示 False (Prime)。相反,要实际检查素数,您需要除以所有可能的 i,并且只有当它们全部给出 non-zero 时,数字才是素数。这意味着您不应该在第一个 non-zero 余数上中断或显示 False。

如果 i 中的任何一个给出零余数,则根据定义给出的数字是合数。因此,与 Prime 情况不同,此 Composite 情况应该 break(或 return)在第一次出现零余数时。

在上面的代码中,我完成了第一个零余数的程序,显示该数字是合数(真)。

只有当整个循环结束(测试所有可能的除数)时,我才会显示 False(那个数字是素数)。

关于 break; 是否足以完成一个循环的问题,那么是的,在 break 循环完成后你不需要 return 0; 在 break 之后,这个 return 语句永远不会完成。

另外一个众所周知的事实是,检查可除性直到除数等于 Sqrt(num) 就足够了,这会快得多。所以你的循环 for (int i = 2; i < num; ++i) 应该变成 for (int i = 2; i * i <= num; ++i) 这是平方倍快。