算法 - 快速幂取模

计算 an % b,其中 a,b 和 n 都是 32 位的非负整数
例子:
Example: 231 % 3 = 2
1001000 % 1000 = 0
问题描述:
输入:a、b、n
输出:快速幂结果

普通方法:

long long calculate(long long  a,long long b,long long n){
	long long  sum = 1;
	for(long long i = 0 ; i < n ; i++){
		sum *= a;
	}
	return sum % b;
}

该方法的时间复杂度为O(n) ,但由于a,b,n的数据规模都比较大,如果用正常的方法计算的话可能会导致数据溢出发生异常,或直接输出错误结果。

快速幂算法:

long long caculate(long long a, long long b, long long n)
{
	long long sum = 1;
	a = a % b;
	while (n > 0) {
		if (n % 2 == 1)		//判断是否是奇数,是奇数的话将多出来的数事先乘如sum
			sum = (sum * a) % b;
 
		n /= 2;
		a = (a * a) % b;// 不断的两两合并再取模,减小a和b的规模
	}
	return sum;
}

该方法时间复杂度为O(logn) 因为循环中每次b都缩减为原来的二分之一。
该算法的思想是不断降低问题规模,将指数拆成二进制形式,在运算开始时先将a%b降低a的数量级,在每次循环中将指数降低为原来的二分之一,并在循环内不断将a两两合并取模,降低 ab 的数据规模,若指数为奇数,将结果乘一个a,然后将结果取模。

参考资料:
https://blog.csdn.net/dbc_121/article/details/77646508
https://blog.csdn.net/iwts_24/article/details/79780596

猜你喜欢

转载自blog.csdn.net/qq_41701363/article/details/88702279