簡體   English   中英

卡在以下 dp 代碼中

[英]Stuck in the following dp code

我編寫了以下 dp 代碼來查找數字的質因數。

#include <bits/stdc++.h>
#define max 1000001
using namespace std;
vector <int> prime;
vector<bool> isprime(max,true);
vector<bool> visited(max,false);
vector<int> data(max,-1);
void dp(int n,int last)
{
    if(n >= max || visited[n])
        return;
    visited[n] = true;
    for(int i = last;i<prime.size();i++)
    {
        if(n*prime[i] >= max || data[n*prime[i]] != -1)
            return;
        data[n*prime[i]] = prime[i];
        dp(n*prime[i],i);
    }
}
int main()
{
    isprime[1] = false;
    data[1] = 1;
    for(int i = 4;i<max;i += 2)
        isprime[i] = false;
    for(int i = 3; i*i< max;i += 2)
    {
        for(int j = i*i; j < max;j += i)
            isprime[j] = false;
    }
    prime.push_back(2);
    data[2] = 2;
    for(int i =3;i<max;i += 2)
        if(isprime[i])
        {
            prime.push_back(i);
            data[i] = i;
        }

    for(int i = 0;i<prime.size();i++)
    {
        dp(prime[i],i);
    }
        cout<<"...1\n";
    for(int i = 2;i<=8000;i++)
    {
        cout<<i<<" :- ";
        int temp = i;
        while(temp!= 1)
        {
            cout<<data[temp]<<" ";
            temp = temp/data[temp];
        }
        cout<<endl;
    }

    return 0;
}

這里, last是素數n的最后一個索引。 但是我為此遇到了分段錯誤,當我將max更改為10001 ,它運行完美。 我不明白為什么會發生這種情況,因為使用的數據結構是一維向量,可以輕松容納高達 10^6 的值。

我使用 GDB 檢查了您的程序。 段錯誤發生在這一行:

if(n*prime[i] >= max || data[n*prime[i]] != -1)

在您第一次在 for 循環中調用 DP 時,您調用 dp(2,0),遞歸調用最終生成此調用:dp(92692,2585)。

92692 * 2585 = 239608820

這個數字大於一個 32 位整數可以容納的值,因此由這兩個數字的整數相乘生成的 r 值溢出並變為負數。 nprime[i] 變為負數,因此上述循環的第一個條件失敗,第二個條件被檢查。 data[n * prime[i]] 被訪問,並且由於 n*prime[i] 是負數,你的程序訪問了無效的內存和段錯誤。 要解決此問題,只需將參數列表中的 n 更改為 long long 就可以了。

void dp(long long n, int last)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM