「学习笔记」快速幂、快速乘与进制转化

快速幂#

快速幂算法,可以比 cmath 库中的 pow 函数更快,还可以处理取模。

原理:#

通过将指数拆分成几个因数相乘的形式,来简化幂运算。

具体操作:#

将指数转化为二进制,如果这一位上是 1,那就乘上这一位上的信息(即 x 的几次方,按照二进制的规则来即可)

二进制位数 ...... 4 3 2 1
对应的十进制 ...... x3 x2 x1 x0

模拟一下以便于理解
e.g. 我们算 310 次方,10 的二进制为 1010
首先,最后一位为 0x = x * x % mod,因为二进制的每向左移一位,就更新为原来的二次方,右移。
现在,最后一位为 1,那么答案乘上 x ,更新 x ,右移。 最后一位为 0x = x * x % mod,右移。
最后一位为1,ans = ans * x % mod, x = x * x % mod,右移,没有位数了,退出。
代码:

typedef long long ll;
ll qpow(ll x, ll y, ll mod) {
	ll ans = 1;
	while(y) {
		if (y & 1) {
			ans = 1ll * ans * x % mod;
		}
		y >>= 1;
		x = 1ll * x * x % mod;
	}
	return ans % mod;
}

这里还有一种递归写法。

int qpow(int x, int y, int p) {
    if (y == 0)    return 1;
    int z = qpow(x, y / 2, p);
    z = 1ll * z * z % p;
    if (y & 1) {
        z = 1ll * z * x % p;
    }
    return z;
}

快速乘#

它的原理与快速幂类似,只是快速幂是拆成几个数相乘,而快速乘是拆成几个数相加。

int qtimes(int x, int y, int p) {
    if (y == 0)    return 0;
    int z = qtimes(x, y / 2, p);
    z = (z + z) % p;
    if (y & 1) {
        z = (1ll * z + x) % p;
    }
    return z;
}

进制转化#

原理#

转十进制:
和上面快速幂的乘法操作很类似,就是每一位所代表的数字乘上这一位上的数字
举个例子
127(8)10 进制

数位上的数 1 2 7
数位含义 82 8 1

127(8) 的十进制数就是 1×82+2×8+7×1=87
转其他进制:
除法和取余,相信大家都学过,这里操作就是依靠除法和取余来实现的
举个例子
87(10)8 进制

87÷8=10······710÷8=1······21÷8=0······1

将余数从下到上输出就行了
可以看一下这道例题,想知道怎么实现的可以参考以下代码
进制转化
代码:

#include<iostream>
#include<cstdio>
typedef long long ll;
using namespace std;
inline ll read()
{
	ll x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x;
}
ll n,num,m;
int pd(char ch)
{
	if(ch>='A'&&ch<='F')	return ch-55;//字母转数字
	if(ch>='0'&&ch<='9')	return ch-'0';//直接返回数字
	return -1;//不是数字,返回-1
}
inline void re(ll &x)
{
	char ch=getchar();
	if(pd(ch)==-1)	ch=getchar();
	while(~pd(ch))
	{
		x*=n;
		x+=pd(ch);
		ch=getchar();
	}
}
ll pr(ll x)
{
	if(x<10)	return x+'0';
	else	return x-10+'A';
}
void print(ll k)//除,取模,倒叙输出
{
	if(!k)	return;
	print(k/m);
	putchar(pr(k%m));
}
int main()
{
	n=read();
	re(num);
	m=read();
	print(num);
	return 0;
}

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/16391435.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示