繁体   English   中英

递归程序不适用于大输入

[英]Recursion program doesn't work for big inputs

我试图从这个网站写一个问题的答案 - https://main2.edu.pl/c/kurs-podstaw-algorytmiki-druga-e/p/kro/

这是关于递归的课程的补充,所以我想出了一个使用它的代码。 它应该显示(a+1)^b 模 10000 余数 不幸的是,对于小数字,我的程序可以工作,但是当它达到更大的数字时,它只是......没有 - 例如:


a = 1
b = 4
output 是16 ,这是正确的。


a = 2
b = 3
output 是27 ,这是正确的。

a = 2
b = 100
它给了我 output -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;
    }
}

与其只取最终结果的余数,不如在每次pot返回一个值时取它。 结果应该是正确的,因为您只是将结果乘以事物,并且(x*y) % m应该等于((x % m) * (y % m)) % m对于正xym .

尝试这个:

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);

至:

r = pot(a, b / 2);
r *= r;

(当然还要加上花括号。)那应该快得多。

更新:我刚刚更正了我的答案,包括原始代码中不存在的第二种情况的else 原始代码中不需要它,但在我更改后需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM