仅使用整数实施POW(X,n)%D.(不利用库功能)

Implement pow(x,n)%d with integers only. (without making use of library functions)

本文关键字:功能 整数 POW      更新时间:2023-10-16

基本上我在指数均匀时使用经典鸿沟和征服。

int mymod(int a,int b){ //returns only positive value between 0 to b-1
    return a%b<0 ? (a%b)+b : a%b;
}
int Solution::pow(int x, int n, int d) {
    if(n==0) return mymod(1,d);
    int result = 1;
    while(n>0){
        if(n%2 == 1)
            result = mymod((result * x),d);
        n = n>>1; //dividing exponent by 2, if it's even. Divide and conquer whenever exponent is even
        x = mymod(x*x,d);
    }
    return result;
}

现在,我正在使用myMod函数来计算模量,'cuz普通模量给了我-VE结果,这与测试用例不符。我需要用整数实施它。这里有一件主要的事情要注意。溢出情况。某些测试用例的X足够大,当成倍增加时可能会溢出。 以下是该程序应满足的测试用例。

X : 0
N : 0
D : 1
expected output: 0
X : -1
N : 1
D : 20
expected output: 19
X : 71045970
N : 41535484
D : 64735492
expected output: 20805472

上面的代码满足前两个测试用例(琐碎),但在最后一个测试案例中失败。Python也被OJ所接受,如果Python,我需要一些解释。谢谢你!!

在行中

result = mymod((result * x),d);

result * x中,您的resultx都可以与d一样大(更确切地说是d-1),因此您需要一个数据类型,该数据类型可以容纳与d*d一样大的整数。对于您的情况,这可能是long long int

另一种方法是不将库operator*用于int s,而是使用仅使用添加剂的类似划分和征服方法来实现手动乘法函数。这样,您将需要一个数据类型,该数据类型只能容纳与2d一样大的整数。

还要注意,您无需每次在主循环中调用mymod。您只能在循环之前将其调用一次,以使x正(x=mymod(x,d)),然后仅使用operator%