c++ - 计算数字的质数除数(不相异)的总和的有效替代方法,直到 num

标签 c++ algorithm numbers runtime-error primes

据说一个数字有n素因数是否可以计入 n质数(不一定不同)。
例如:

12 = 2*2*3 ---> 12 has 3 prime divisors  

给定数字 ab我们必须找到 a! 的此类质数因子的数量/b! (a>=b)。因此,我决定采用以下方式:

long long pre[5000001];

long long solve(int num)
{
    if(!num)
        return 0;
    if(pre[num] || num==1)
        return pre[num];
    int num1=num;
    if(num1%2==0)
    {
        int cnt=0;
        while(num1%2==0)
        {
            num1/=2;
            cnt++;
        }
        pre[num] = solve(num-1) + (solve(num1)-solve(num1-1)) + cnt;
        return pre[num];
    }

    for(int i=3;i<=(int)(sqrt(num1))+1;++i)
    {
        if(num1%i==0)
        {
            int cnt=0;
            while(num1%i==0)
            {
                cnt++;
                num1/=i;
            }
            pre[num] = solve(num-1) + (solve(num1)-solve(num1-1)) + cnt;
            return pre[num];
        }
    }
    if(num>1)
    {
        pre[num]=1 + solve(num-1);
        return pre[num];
    }
}

int main()
{
    int t;
    cin>>t;
    pre[1]=0;
    while(t--)
    {
        int a,b;
        cin>>a>>b;
        long long ans = solve(a)-solve(b);
        cout<<ans<<endl;
    }
    return 0;
}

我的方法基本上是计算质数因子的数量并存储它们,因为 a 的极限和 b<=5000000 . pre[num]给出所有数的质因数之和 <=num .但它会导致较大输入的运行时错误,例如 a=5000000 b=4999995 .有没有更好的方法来做到这一点,或者可以调整当前的方法以获得更好的解决方案?

最佳答案

您达到了递归的限制。

要解决您的问题,您可以首先构建从 0 到 a 的数组:

int main()
{
    int max_a = 0;
    int t;
    cin >> t;
    pre[1] = 0;
    while(t--)
    {
        int a, b;
        cin >> a >> b;

        for (int i = max_a; i < a; ++i) {
            solve(i); // memoization until `a` max recursion is limited to 1 :)
        }
        max_a = std::max(max_a, a);
        long long ans = solve(a) - solve(b);
        std::cout << ans << std::endl;
    }
}

关于c++ - 计算数字的质数除数(不相异)的总和的有效替代方法,直到 num,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128906/

相关文章:

c++ - ofVec2f 和 ofPoint 的区别

c++ - 嵌入式C++——多态与继承

c++ - 未定义对友元运算符的引用

c++ - 有什么需要,局部静态变量在编译时分配内存?

r - 是否可以仅从 R 中的 logLik 对象中提取对数似然值?

javascript - javascript中数字到字符串的转换错误

从数组中按级别顺序创建二叉树

php - 权衡搜索结果

c# - 编译器错误 : operator "*"and"+"cannot be applied

java - 比较两个通用数字的值