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

return very large integer from recursive function

本文关键字:整数 非常 递归函数 返回      更新时间:2023-10-16

我在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);
}

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

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

它打印了-194114669。

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

关于模算术的几点注记

如果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,我知道有很多括号和子表达式,但这是为了尽可能避免整数溢出。

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

#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都有数学背景。

如果问题是(正如您所说)它溢出了long long int,则使用任意精度的Integer库。示例如下。