我在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。
答案 0 :(得分:2)
通常online judges
问题不需要使用大整数(通常意味着几乎总是如此),如果你的解决方案需要大整数可能不是解决问题的最佳解决方案。
如果a1 = b1 mod n
和a2 = 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。