为什么这个代码不适用于大数字
Why is this code not working for big number?
我正在做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
,这是随机行为(,你也会处理它,产生错误的结果。
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++带有适用于左值和右值的引用参数的函数
- 代码适用于调试,但不适用于发布
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 适用于大型数组的无复制线程安全环形缓冲区
- NRVO 是否也适用于协程?
- 约束包容是否仅适用于概念?
- 程序只适用于包含(无副作用)cout声明
- 适用于频繁更改的大型数据集的最佳数据结构
- printf 的浮点格式标志 (%f) 仅适用于英文数字格式
- 是否有适用于迭代器的数字解析函数
- 我可以得到一个适用于任何数字类型的模板化均匀分布生成器吗?