C++ 递归程序不';我不能为大投入工作
我试着在这个网站上写一个问题的答案- 这是对递归的补充,所以我想出了一个使用它的代码。它应该显示(a+1)^b模10000余数。不幸的是,对于较小的数字,我的程序可以工作,但当它达到较大的数字时,它只是。。。不会-例如:C++ 递归程序不';我不能为大投入工作,c++,recursion,C++,Recursion,我试着在这个网站上写一个问题的答案- 这是对递归的补充,所以我想出了一个使用它的代码。它应该显示(a+1)^b模10000余数。不幸的是,对于较小的数字,我的程序可以工作,但当它达到较大的数字时,它只是。。。不会-例如: a=1 b=4 输出为16,这是正确的 a=2 b=3 输出为27,这是正确的。 a=2 b=100 它给我的输出是-8495,这是完全错误的 我试着寻找它,但我没有找到解决问题的正确方法,因为我真的不知道发生了什么。我在想,可能是因为数据类型太小,但将int更改为long
a=1
b=4
输出为16,这是正确的
a=2
b=3
输出为27,这是正确的。
a=2
b=100
它给我的输出是-8495,这是完全错误的 我试着寻找它,但我没有找到解决问题的正确方法,因为我真的不知道发生了什么。我在想,可能是因为数据类型太小,但将int更改为long int,并没有改变任何东西 这是我的密码:
#include <iostream>
using namespace std;
int pot(int a, int b){
if (b == 1)
return a;
if (b % 2 == 0) //test for even number
return pot(a, b / 2) * pot(a, b / 2);
else //make it even number
return a * pot(a, b - 1);
}
main(){
int a, b;
int P;
cin>>P;
for(int i = 1; i<=P; i++){
a = 0;
b = 0;
cin>>a;
cin>>b;
cout<<endl<<(pot(a+1, b))%10000;
}
}
#包括
使用名称空间std;
内罐(内罐a、内罐b){
如果(b==1)
返回a;
if(b%2==0)//测试偶数
返回罐(a,b/2)*罐(a,b/2);
否则//使其成为偶数
返回a*pot(a,b-1);
}
main(){
INTA,b;
INTP;
cin>>P;
对于(int i=1;i>a;
cin>>b;
cout不要只获取最终结果的剩余部分,每次pot
返回值时都应该获取。结果应该是正确的,因为您只是将结果乘以事物,并且(x*y)%m
应该等于((x%m)*(y%m))%m
表示正x
、y
和m
试试这个:
int pot(int a, int b){
int r;
if (b == 1)
r = a;
else if (b % 2 == 0) //test for even number
r = pot(a, b / 2) * pot(a, b / 2);
else //make it even number
r = a * pot(a, b - 1);
return r % 10000;
}
另外,在第二种情况下,您正在复制pot(a,b/2)
的计算,这将大大降低计算速度。您应该更改:
r = pot(a, b / 2) * pot(a, b / 2);
致:
(当然还要加上大括号。)这应该快得多
更新:我刚刚更正了我的答案,为第二个案例添加了一个原始代码中不存在的else
。原始代码中不需要它,但在我的更改后需要它。pot(3100)
对于任何标准整数数据类型来说都太大了。您必须找到一种算法来减少中间结果的大小。根据您的平台,int
和long int
可能是相同的。@G.Sliepen no,pot(a,b)
返回大的数字,模在main的最后一行。每次乘法后都应该执行模运算。此外,您可以避免使用简单循环进行递归,使用循环甚至可以通过调用pot(a,b/2)*pot(a,b/2)获得O(logn)效率
,通过将调用数以指数方式分解,您可以消除在日志时间内快速计算的所有优势。最后,您可以使用线性时间。我建议您存储pot(a,b/2)的单个调用的结果
在一个变量中,并将其用于乘法。问题是关于修复模计算。显然,双递归函数不会有效。在关于模部分的答案中评论性能似乎是错误的。我正在visual studio中尝试您的解决方案,但我遇到堆栈溢出错误。未处理的异常在控制台应用程序2.exe的0x00E02879处打开:0xC00000FD:堆栈溢出(参数:0x00000001、0x002F2F98). occurred@NileshSolanki哦,我明白了问题所在-原始代码中没有else
,这与它何时返回无关,但在我将其更改为作业时需要它。我刚刚更新了我的答案。它现在应该可以工作了。感谢您让我知道有问题。
r = pot(a, b / 2);
r *= r;