编码代码导致分段错误
Codility code causes segmentation fault
这是我对 Count Semiprimes codility 问题的解决方案,它对中小型输入是正确的,但对于大型测试用例会导致分段错误。
https://codility.com/demo/results/demo8JU794-FC7/
这通常发生在无效指针等上,但是我在这里看不到任何可能导致这种行为的内容。
你能发现代码有什么问题吗?
vector<int> solution(int N, vector<int> &P, vector<int> &Q) {
int M = P.size();
// Use sieve of eratosthenes to find prime numbers within range 0 to N
vector<int> sieve(N+1);
sieve[0] = sieve[1] = 0;
for (int i = 2; i <= N; ++i)
{
if (sieve[i] == 0)
{
int k = i * i;
while(k <= N)
{
// For each non prime store its lowest prime divisor.
sieve[k] = i;
k += i;
}
}
}
vector<int> answer(M);
for (int i = 0; i < M; ++i)
{
// Count semiprimes for each range (P[i], Q[i])
int count = 0;
for(int j = P[i]; j <= Q[i]; ++j)
{
// If a number is divisible by prime and the result of this division is also a prime
// Then it's a semiprime.
if (sieve[j] != 0 && sieve[j / sieve[j]] == 0)
{
count++;
}
}
answer[i] = count;
}
return answer;
}
在这一部分中,对于 N = 50000,k = i * i
的结果溢出了一个 int,这是段错误的原因。
if (sieve[i] == 0)
{
int k = i * i;
while(k <= N)
{
// For each non prime store its lowest prime divisor.
sieve[k] = i;
k += i;
}
}
你能发布 seg 故障在哪里吗?
仅从外观上看,当 N 为 0 时,sieve[0] = sieve[1] = 0;
将表现出未定义的行为。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?