为什么这段代码给我分段,?当我们只打印 count 时它给出答案,当打印 ans[4] 或任何值时它给出错误?

Why is this code giving me segmentation, ? when we print only count then it gives answer and when print ans[4] or any value then it gives error?

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

的因子数组

核心Dump/Segmentation故障是由于访问“不属于您”的内存而导致的一种特定错误。

当一段代码试图在内存中的只读位置或释放的内存块中进行读写操作时,它被称为核心转储。 这是一个错误,表明内存损坏。

    #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.clear();ans.clear(); 之后访问 arr[k]ans[n] 并且不添加任何元素是不好的,因为 clear() 函数从向量。在擦除后检查 arr[k] == 1 也没有意义。不太理解你的代码,看起来像

        arr.clear();
        ans.clear();

应该替换成类似

的东西
        ans.clear();
        ans.resize(1000001);