为什么 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;
我会像下面这样更正您的代码(见后面的描述):
#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)
这是平方倍快。
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;
我会像下面这样更正您的代码(见后面的描述):
#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)
这是平方倍快。