C++ 循环在程序中何时终止,因为它始终具有正值?

C++ 循环在程序中何时终止,因为它始终具有正值?,c++,discrete-mathematics,number-theory,C++,Discrete Mathematics,Number Theory,它是模幂的函数。我想问一下这个while循环。这个循环什么时候结束?因为exp始终大于0。我也不明白这个循环是如何运行的,它是如何逐行运行的。我不明白这个循环的方法 首先你应该格式化你的代码,否则它读起来不好 long long fast_exp(long long int base,long long int exp,int p) { int res=1; while(exp>0) { if(exp%2==1) {res=(res*base)%p;} exp=exp>>1;

它是模幂的函数。我想问一下这个while循环。这个循环什么时候结束?因为
exp
始终大于0。我也不明白这个循环是如何运行的,它是如何逐行运行的。我不明白这个循环的方法

首先你应该格式化你的代码,否则它读起来不好

long long fast_exp(long long int base,long long int exp,int p) {
int res=1;
while(exp>0) {
if(exp%2==1)
{res=(res*base)%p;}
exp=exp>>1;
base=(base*base)%p;

}
return res;
}
注意带有注释的行
exp
循环的每次迭代右移1,因此它最终将达到零,从而终止循环

我认为这很好地解释了这个算法,所以我不必重复它。维基百科显示的伪代码与您的代码几乎完全相同。一行一行地比较一下

这里也有一些错误:

  • 模数表示为
    int p
    ,应为
    long p
  • 返回值是
    int res
    ,它应该是
    long-long res

如果您想逐行了解它的工作原理,请使用调试器并逐行检查代码。这不是一个教程网站,而且因为问题还不清楚。也许你应该花点时间思考一下什么是
exp=exp>>1可以。记住数学课上的2k:th次方是k:th次方的平方。请缩进代码,并在整个代码中一致使用一个。这样做使它更易于阅读/维护。对堆栈溢出上的代码这样做,用户很可能会对您的帖子进行投票,人们也会花时间回答您的问题。选择哪种样式并不重要(尽管对于某些语言,某些样式比其他样式更合适)。但是,选择一个并在单个项目中的所有代码中一致地使用它。
long long fast_exp(long long int base, long long int exp, int p) {
    int res = 1;
    while (exp > 0) {
        if (exp % 2 == 1) {
            res = (res * base) % p;
        }
        exp = exp >> 1;  // Note
        base = (base * base) % p;
    }
    return res;
}