版权声明:转载留名即可 ^_^ https://blog.csdn.net/qq_33375598/article/details/88741838
1,快速幂运算
1.1方法1
typedef long long LL;
LL binaryPow(LL a, LL b, LL m){
if(b == 0) return 1;
if(b % 2 == 1) //可以替换为 if(b&1)
return a * binaryPow(a, b - 1, m) % m;
else{
LL mu1 = binaryPow(a, b / 2, m);
/*不可直接返回binaryPow(a, b / 2, m)*binaryPow(a, b / 2, m)
因为会调用两次binaryPow函数,导致复杂度变为O(2^log(b)) = O(b)
*/
return mu1 * mu1 % m;
}
}
1.2方法2
typedef long long LL;
LL binaryPow(LL a, LL b, LL m){
LL ans = 1;
while(b > 0){
if(b & 1){ //如果b的二进制末尾为1
ans = ans * a % m;//令ans累计a
}
a = a * a % m; //令a开平方
b >>= 1; //将b的二进制右移一位
}
return ans;
}
2, 日期计算(求两个日期间的差值)
int month[13][2] ={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
int ans = 1;
while(y1 < y2 || m1 < m2 || d1 < d2){
d1++;
if(d1 == month[m1][isLeap(y1)] + 1){
d1 = 1;
m1++;
}
if(m1 == 13){
m1 = 1;
y1++;
}
ans++;
}