Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归程序不';我不能为大投入工作_C++_Recursion - Fatal编程技术网

C++ 递归程序不';我不能为大投入工作

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模10000余数。不幸的是,对于较小的数字,我的程序可以工作,但当它达到较大的数字时,它只是。。。不会-例如:


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;