从递归函数返回非常大的整数

时间:2014-09-07 16:35:27

标签: c++ function recursion long-integer

我在c ++中创建了一个递归函数,它处理非常大的整数。

long long int findfirst(int level)
{
    if(level==1)
    return 1;
    else if(level%2==0)
    return (2*findfirst(--level));
    else
    return (2*findfirst(--level)-1);
}

当输入变量(级别)为高时,它达到long long int的限制并给出错误的输出。 我想打印(输出%mod),其中mod是10 ^ 9 + 7(^是幂)。

int main()
{
    long long int first = findfirst(143)%1000000007;
    cout << first;
}

打印-194114669。

2 个答案:

答案 0 :(得分:2)

通常online judges问题不需要使用大整数(通常意味着几乎总是如此),如果你的解决方案需要大整数可能不是解决问题的最佳解决方案。

关于modular arithmetic

的一些注释

如果a1 = b1 mod na2 = b2 mod n则:

a1 + a2 = b1 + b2 mod n
a1 - a2 = b1 - b2 mod n
a1 * a2 = b1 * b2 mod n

这意味着模数运算是传递的(a + b * c) mod n可以计算为(((b mod n) * (c mod n)) mod n + (a mod n)) mod n,我知道有很多括号和子表达式,但这是为了尽可能避免整数溢出。< / p>

只要我理解你的程序,你根本不需要递归:

#include <iostream>

using namespace std;

const long long int mod_value = 1000000007;

long long int findfirst(int level) {
    long long int res = 1;
    for (int lev = 1; lev <= level; lev++) {
        if (lev % 2 == 0)
            res = (2*res) % mod_value;
        else
            res = (2*res - 1) % mod_value;
    }
    return res;
}

int main() {
    for (int i = 1; i < 143; i++) {
        cout << findfirst(i) << endl;
    }
    return 0;
}

如果您需要进行递归,请将解决方案修改为:

long long int findfirst(int level) {
    if (level == 1)
        return 1;
    else if (level % 2 == 0)
        return (2 * findfirst(--level)) % mod_value;
    else
        return (2 * findfirst(--level) - 1) % mod_value;
}

mod_value与之前相同的地方:

请仔细研究模块化算法,并应用于以下online challenge(发现的回报,解决方案本身就是为了让它走得更远)。大多数online challenge都有数学背景。

答案 1 :(得分:1)

如果问题是(如你所说)溢出long long int,那么使用任意精度的Integer库。示例是here