快速幂计算 (简单计算器)

   日期:2020-09-22     浏览:173    评论:0    
核心提示:输入第一行输入n,表示接下来要输入n组;接下来n行,分别三个,a, b, s, 分别表示要操作的两个数,和操作符号,比如1 2 +,表示1+2,2 1000000000 ^,表示2的1000000000次方;因为结果可能很大,所以都要与1000000007取模再输出;输出输出计算结果,用换行隔开;C++代码#include<iostream>#define ll long longusing namespace std;ll p = 1000000007;l

输入

第一行输入n,表示接下来要输入n组;

接下来n行,分别三个,a, b, s, 分别表示要操作的两个数,和操作符号,比如1 2 +,表示1+2,2 1000000000 ^,表示2的1000000000次方;

因为结果可能很大,所以都要与1000000007取模再输出;

输出

输出计算结果,用换行隔开;

C++代码

#include<iostream>
#define ll long long
using namespace std;
ll p = 1000000007;
ll quickpow(ll a, ll b) {
	ll ans = 1;
	while (b) { 
		if (b & 1) ans = ans * a % p;
		a = a * a % p, b = b >> 1;
	}return ans % p;
}

int main() {
	int i;
	cin >> i;
	while (i) {
		ll a, b;
		char s;
		cin >> a >> b >> s;
		if (s == '+') cout << (a % p + b % p) % p << endl;
		if (s == '-') cout << (a % p - b % p) % p << endl;
		if (s == '*') cout << ((a % p) * (b % p)) % p << endl;
		if (s == '^') cout << quickpow(a, b) << endl;
		i--;
	}return 0;
}

这里重要的是求幂运算,如果是按照常规方法,求幂就是不停的乘自身,复杂度是O(n),通过快速幂,复杂度降为对数级。

在这里关键的是指数b的移位操作,b=b>>1,就是将二进制的b向右边移动一位,举个例子,2的11次方,11的二进制是1011,那2的11次方,就是2的二进制的1011次方,就是2的(8+2+1)次方,其中8,2,1就是二进制的位置的数,根据幂指数运算法则,2^(11)=2^(8+2+1)=2^8*2^2*2^1,相乘的数之间具有规律,都是前一个数位的平方,只要该数在该二进制位是1,这里就要乘以对应的数,每乘一次,二进制b就右移动一位,当b右移到为0,就退出,乘积结束,这就是快速幂的数学原理。

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服