问题描述
I am getting segmentation error,it gives output when only print ans[k] inside the function then it
gives corrct output but in main when I try to print ans[k] then it gives segmentation
i am new at progamming so i don't know more about it so please help me it's my assigment
问题是
我必须创建一个最大为 4 * 10^6 的因数数组
Core Dump/Segmentation fault 是由于访问“不属于您”的内存而导致的一种特定类型的错误。
当一段代码试图在内存中的只读位置或已释放的内存块中进行读写操作时,称为核心转储。 这是一个指示内存损坏的错误。
#include <bits/stdc++.h>
using namespace std;
#define int long long int
vector<int> arr(1000001,0);
vector<int> ans;
bool isPrime(int n)
{
if (n <= 1)
return false;
if (n <= 3)
return true;
if (n % 2 == 0 || n % 3 == 0)
return false;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
void factorpush()
{
for (int k = 5; k <= 4000001; k += 4)
{
if (isPrime(k))
{
arr[k] = 1;
}
}
arr.clear();
ans.clear();
for (int k = 5; k <= 4000001; k += 4)
{
if (arr[k] == 1)
{
int n = (k / 4);
ans[n] = (2 * n) - 1 + k;
}
else
{
vector<int> v;
for (int i = 1; i*i < k; i++)
{
if (k % i == 0)
{
if (k / i == i && i != k)
v.push_back(i);
else
{
if (i != k)
{
v.push_back(i);
}
if (k / i != k)
{
v.push_back(k/ i);
}
}
}
}
int count = k;
int count2 = 0;
for (auto x : v)
{
if (x != 1 && x!=k)
{
int n = (k/4);
count2 += ((2*n - 1)/x);
count += ((2*n - 1)/x)*x;
}
}
int n1 = (k/4);
int val = (2*n1) - 1 - count2;
count += val;
ans[n1] = count;
//cout<<ans[n1]<<"\n";
}
}
}
int32_t main()
{
factorpush();
int n;
cin>>n;
cout<<ans[n]<<"\n";`
return 0;
}
解决方法
我没有很好地阅读您的代码,可能还有其他错误,但至少是
的组合 vector<int> arr(1000001,0);
和
for (int k = 5; k <= 4000001; k += 4)
{
if (isPrime(k))
{
arr[k] = 1;
}
}
不好,因为 arr[k]
会比分配的更进一步。
你必须分配足够的元素,比如
vector<int> arr(4000002,0);
在 arr[k]
和 ans[n]
之后访问 arr.clear();
和 ans.clear();
并且不添加任何元素是不好的,因为 clear()
函数会从向量中删除所有元素。在擦除后检查 arr[k] == 1
也没有意义。不太了解你的代码,看起来像
arr.clear();
ans.clear();
应该用类似的东西替换
ans.clear();
ans.resize(1000001);