C++ 循环在程序中何时终止,因为它始终具有正值?
它是模幂的函数。我想问一下这个while循环。这个循环什么时候结束?因为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;
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;
}