快速幂的大数运算_快速幂模

快速幂的大数运算_快速幂模快速幂运算1.什么是快速幂2.快速幂的“小数”运算3.高精度(大数)的快速幂1.什么是快速幂快速幂,是指在进行幂运算的时候,用一种快速方法得出答案。比如,要求2^100的值,那按照最简单的方式,就是一个一个2去相乘,然后最终得到答案,那么这样就要计算100次,非常浪费时间,那么快速幂就是使用一种技巧使得将其计算次数减少,快速得到答案。2.快速幂的“小数”运算对于系统内置类型的整型,暂且叫他“小数”,这个时候进行快速幂运算,代码如下:#include<cstdio>#include&l

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1.什么是快速幂

快速幂,是指在进行幂运算的时候,用一种快速方法得出答案。比如,要求2^100的值,那按照最简单的方式,就是一个一个2去相乘,然后最终得到答案,那么这样就要计算100次,非常浪费时间,那么快速幂就是使用一种技巧使得将其计算次数减少,快速得到答案。

2.快速幂的“小数”运算

对于系统内置类型的整型,暂且叫他“小数”,这个时候进行快速幂运算,代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const long long int mod = 1000000000007;   //对答案取模
int main()
{ 
   
	long long int n;
	long long int ans = 1;
	long long int temp = 2;
	cin >> n;   //求2的n次方
	printf("2的%lld次幂对对1000000000007取模的最终值是:", n);
	while (n > 0)  //快速幂模板
	{ 
   
		if (n%2 == 1)
			ans = (ans%mod * temp%mod) % mod;
		n /= 2;
		temp = (temp % mod * temp % mod)%mod;
	}
	printf("%lld",ans%mod);
	return 0;
}

Jetbrains全家桶1年46,售后保障稳定

那么快速幂的原理是什么呢?
用一张图来表示
在这里插入图片描述

3.高精度(大数)的快速幂

上面的代码发现当n的值稍微大一点就不行了,但是用高精度运算就不要有这种限制。下面是代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

long long int ans[100000];  //存放答案
long long int temp[100000];  //存放2的2^n的值
long long int save[100000];    //临时数组

int ans_len = 1;
int temp_len = 1;
void count_1(long long int* ans, long long int* temp)  //计算数组ans*数组temp,实际上就是简单的高精度大数相乘了
{ 
   
	memset(save, 0, sizeof(save));
	for (int i = 0; i < ans_len; i++)  //先不考虑进制
	{ 
   
		for (int j = 0; j < temp_len; j++)
		{ 
   
			save[i + j] += ans[i] * temp[j];
		}
	}
	int weishu_max = ans_len + temp_len;   //最终答案最终这么多位数。可以那9999*9999这种极端证明
	for (int i = 0; i < weishu_max; i++)
	{ 
   
		save[i + 1] += save[i] / 10;
		save[i] %= 10;
	}
	if (save[weishu_max - 1] != 0)  //n位数*m位数要么就是m+n位数,要么就是m+n-1位数
		ans_len = weishu_max;
	else
	{ 
   
		ans_len = weishu_max - 1;
	}
	for (int i = 0; i < ans_len; i++)  //将save的复制给ans
		ans[i] = save[i];
}


void count_2(long long int* temp)   //算2的2^n次方,也就是temp自乘
{ 
   
	memset(save, 0, sizeof(save));
	for (int i = 0; i < temp_len; i++)
		for (int j = 0; j < temp_len; j++)
			save[i + j] += temp[i] * temp[j];
	int weishu_max = temp_len + temp_len;
	for (int i = 0; i < weishu_max; i++)
	{ 
   
		save[i + 1] += save[i] / 10;
		save[i] %= 10;
	}
	if (save[weishu_max - 1] != 0)
		temp_len = weishu_max;
	else
		temp_len = weishu_max - 1;
	for (int i = 0; i < temp_len; i++)
		temp[i] = save[i];

}

int main()
{ 
   
	int n;
	cin >> n;
	ans[0] = 1;
	temp[0] = 2;
	while (n > 0)
	{ 
   
		if (n % 2 == 1)
		{ 
   
			count_1(ans, temp);
		}
		n /= 2;
		count_2(temp);
	}
	for (int i = ans_len-1; i >=0; i--)
	{ 
   
		cout << ans[i];
	}
	return 0;
}

如果用不考虑进制的做法话,实际上求大数还是有一定的限制,因为一个数组元素最多临时保存了n个数相加,如果当这n个数的和大于long long int的范围,那就会出错。那么可以用考虑进制的做法,虽然麻烦一点,但是会完美无缺,具体做法之前的博客都有提到,可以去看一看。实际上也非常简单,写个乘法竖式总结一下规律就可以写了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215486.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123[通俗易懂]

    VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123[通俗易懂]使用VMware®Workstation11.1.2build-2780323安装MacOS系统时出现以下错误:VMwareWorkstation不可恢复错误:(vcpu-0)vcpu-0:VERIFYvmcore/vmm/main/physMem_monitor.c:1123日志文件位于“H:\VMware\OSX\vmware.log”中。您可以请求支持。…

    2022年10月3日
  • pycharm windows 重置_pycharm重置设置,恢复默认设置「建议收藏」

    pycharm windows 重置_pycharm重置设置,恢复默认设置「建议收藏」备忘,备忘,备忘2020-03-23日更新,重置有问题的,请参考底部官网链接.(另外:喷我并不能解决你的问题.)window系统找到下方目录–>删除.再重新打开pycharm#WindowsVista,7,8,10:\Users\\.例:C:\Users\Administrator\.PyCharm2018.1#WindowsXP:\DocumentsandSett…

    2022年8月27日
  • sdfsfd

    sdfsfd

    2021年11月14日
  • 官网下载mysql连接驱动jar包教程「建议收藏」

    官网下载mysql连接驱动jar包教程「建议收藏」1.网址上输入mysql.com后回车2.点击如图所示3.滑下来找到如图所示并点击4.进来后,点击如图所示5.选择不同版本5.1下载最新版本的,如图按步骤点击5.2下载其他版本点击这个6.点击后下载第二个7.点击后,点击如下,几秒后即可完成下载,(有时候第6步就直接下载了,就不需要这步了)8.下载完后解压,找到如下文件,这就是ja…

    2022年5月11日
  • 常用的web前端开发工具有哪些_web前端开发软件工具

    常用的web前端开发工具有哪些_web前端开发软件工具在建设网页时,为了快速、高效地完成任务,通常会使用一些具有代码高亮显示、语法提示等便捷功能的前端开发工具。常用的web前端开发工具有Dreamweaver、Sublime、HBuilder等,具体介绍如下。1、DreamweaverDreamweaver简称DW(中文译为“梦想编织者”),是美国MACROMEDIA公司开发的集网页制作和网站管理于一身的“所见即所得”网页编辑器,2005年被Adobe公司收购。Dw是第一套针对非专业网站建设人员的视觉化网页开发工具,利用它可以轻而易举地制作网页。2、Su

    2022年8月31日
  • 【原创】ERROR 1142 (42000): command denied to user 引发的权限不足问题[亲测有效][通俗易懂]

    【原创】ERROR 1142 (42000): command denied to user 引发的权限不足问题[亲测有效][通俗易懂]mysqlgrants引发的权限不足问题[42000]基于mysql5.7.x1、先退出mysql,找到mysql的配置文件我的文件在这里./etc.my.cnf2、然后重新启动mysql,3、进入mysql,切换到mysql数据库,找到user表,查看user表的权限:4、修改权限,基于mysql5.7.x正常创建数据库查看权限>>>showgrants;…

    2022年9月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号