从递归函数返回非常大的整数
return very large integer from recursive function
我在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 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
,我知道有很多括号和子表达式,但这是为了尽可能避免整数溢出。
只要我理解你的程序,你就根本不需要递归:
#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库。示例如下。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- C++非常长的整数计数器
- C++整数除法给出非常大的数字
- CMAC:非常长的整数作为 random() 函数的种子
- 如何创建非常大的唯一整数数组
- 声明一个非常大的整数向量
- 在C++中对存储为字符串的非常大的整数进行除法运算
- 从递归函数返回非常大的整数
- 用于计算非常非常大的正整数的幂函数的数字模
- 在c++中乘非常大的整数时避免溢出
- 对于非常大的整数,什么变量类型