题目描述
知识点
二分幂/快速幂
实现
码前思考
- 考虑要不要用
LL
?
不需要!10000*10000
在int
的范围之内;
代码实现
//二分幂题
#include "bits/stdc++.h"
using namespace std;
int a;
int b;
int binaryPow(int a,int b,int m){
if(b == 0){
return 1;
}else{
if(b%2 == 1){
return a * binaryPow(a,b-1,m) % m;
}else{
int mul = binaryPow(a,b/2,m);
return mul * mul % m;
}
}
}
int main(){
while(~(scanf("%d",&a))){
scanf("%d",&b);
if(a == 0 && b == 0){
break;
}
int ans = binaryPow(a,b,1000);
printf("%d\n",ans);
}
return 0;
}
码后反思
- 貌似二分求幂好像用的最多的就是求余数了。。。
- 对于判别奇偶数可以使用
&
运算符! - 上面的是递归的写法,其实还有迭代的写法,也就是递推;
- 注意每次函数返回时都要
%m
这样才能减小规模!
二刷代码
建议还是使用long long
来存储快速幂的结果。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll; //快速幂模板建议使用long long
ll binaryPow(ll a,ll b,ll m){
if(b==0){
return 1;
}else{
if(b&1==1){ //奇数
return (a*binaryPow(a,b-1,m))%m;
}else{ //偶数
ll mul = binaryPow(a,b/2,m);
return (mul*mul)%m;
}
}
}
int main(){
ll a,b;
while(scanf("%lld %lld",&a,&b)!=EOF){
if(a==0 && b==0){
return 0;
}
//求快速幂
printf("%lld\n",binaryPow(a,b,1000));
}
return 0;
}