为什么这个代码不适用于大数字

Why is this code not working for big number?

本文关键字:适用于 数字 不适用 代码 为什么      更新时间:2023-10-16

我正在做Bjarne Stroustrup编程原理和使用C++的实践中的问题4.11。创建一个程序,使用素数向量按顺序(素数[2,3,5,…](找到从1到最大范围内的所有素数。这是我的解决方案:

#include <iostream>
#include <string>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
bool check_prime(vector<int> &prime, int n) {
int count = 0;
for (int i = 0; prime[i] <= n || i <= prime.size() - 1; ++i) {
if (n % prime[i] == 0) {
count++;
break;
}
}
bool result = 0;
if (count == 0)
result = 1;
else
result = 0;
return result;
}
int main() {
vector<int> prime{2};
int max;
cout << "Please enter a max value:";
cin >> max;
for (int i = 2; i <= max; ++i) {
if (check_prime(prime, i))
prime.push_back(i);
}
for (int i = 0; i <= prime.size() - 1; ++i) {
cout << prime[i];
if (i <= prime.size() - 2)
cout << ',';
}
}

我的代码适用于小于23的数字,但不能适用于更大的数字。如果我在Windows 10中打开程序,最大的工作数量增加到47,任何比这更大的都无法工作。

此条件

prime[i]<=n||i<=prime.size()-1

只要其中至少有一个为真,就会使循环继续,并且您正在访问prime[i]而不检查i的值
一旦i == prime.size(),这将导致未定义的行为
这意味着任何事情都可能发生,而你所经历的任何特定价值观都在发挥作用,这只是一个不幸的巧合。

您需要首先检查边界,并且只应在两个条件都为true的情况下继续:

i <= prime.size() - 1 && prime[i] <= n 

哪一个写得更习惯

i < prime.size() && prime[i] <= n 

(适应传统的半开放间隔永远不会太早。(

i<=prime.size()-1之前检查prime[i]<=n。然后,如果它是真的(即使i>prime.size()-1,这是随机行为(,你也会处理它,产生错误的结果。