2023/11/25 幂的末尾(快速幂,对齐输出)

12 篇文章 0 订阅

 题目描述

幂 a^b的末 3 位数是多少?

 输入格式

两个正整数 a,b。1<=a<=100;1<=b<=10000

从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。

输入:2 3 输出:008;输入:7 2011输出:743

首先观察a,b的范围:1<=a<=100;1<=b<=10000。无法把a^b给计算出来。那么就有如下的思路。

由于取模运算的性质:

(a*b)%p=[(a%p)*(b%p)]%p.

  1. (a + b) % p = (a % p + b % p) % p (1)

  2. (a - b) % p = (a % p - b % p ) % p (2)

  3. (a * b) % p = (a % p * b % p) % p (3)

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;

int main()
{
	int a, b;
	cin >> a >> b;
	int x=1;
	for (int i = 0; i < b; i++)
	{
		x *= a;
		x %= 1000;
	}
	if (x > 99)
	{
		cout << x << endl;
	}
	else if (x <= 99 && x > 9)
	{
		cout << "0" << x << endl;
	}
	else if(x<10)
	{
		cout << "00" << x << endl;
	}
		return 0;
}

然而这样的复杂程度仍然是O(b).所以我们要继续优化算法。

这个过程中,当我们的指数是偶数时,我们就把底数平方,指数/2.当指数是奇数时,我们就分一个原底数出来,再接着继续指数为偶数时的操作。这样大大减少了复杂度=O(log2b).将所有变量均定义为long long。

long long quickpow(long long a, long long b,long long p)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % p , b / 2);
	}
	else
	{
		return quickpow(a * a % p, b / 2) * a % p ;
	}
}

完整代码如下

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
long long quickpow(long long a, long long b)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % 1000, b / 2);
	}
	else
	{
		return quickpow(a * a % 1000, b / 2) * a % 1000;
	}
}
int main()
{
	long long a, b;
	cin >> a >> b;
	cout << setfill('0')<<setw(3)<<quickpow(a, b) % 1000 << endl;

	return 0;
}

 s和a之间有7个空格,cout<<'s'<<setw(8)<<'a'<<endl;的意思是s后面输出8个字符,其中a占一个字符,剩余7个字符用空格填充

setw()默认填充的内容为空格,可以setfill()设置其他字符填充。

cout<<'s'<<setfill('*')<<setw(8)<<'a'<<endl;

则输出:


————————————————
版权声明:本文为CSDN博主「沈辞镜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_80023141/article/details/134571577

快速幂

题目描述

给你三个整数 a,b,p,求 a^b mod p。

输入格式

输入只有一行三个整数,分别代表 a,b,p。

输出格式

输出一行一个字符串 `a^b mod p=s`,其中 a,b,p 分别为题目给定的值, s 为运算结果。

样例输入 
2 10 9
样例输出 
2^10 mod 9=7

 

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
long long quickpow(long long a, long long b,long long p)
{
	if (b == 0)
	{
		return 1;
	}
	else if (b % 2==0)
	{
		return quickpow(a * a % p, b / 2, p);
	}
	else
	{
		return quickpow(a * a % p, b / 2, p) * a % p;
	}
}
int main()
{
	long long a, b, p;
	cin >> a >> b >> p;
	cout << a << "^" << b << " mod " << p << "=" << quickpow(a, b, p) % p << endl;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值