《编程思维与实践》1059.计算a的n次方的大整数

news2024/11/30 6:47:39

《编程思维与实践》1059.计算a的n次方的大整数

题目

在这里插入图片描述

思路

高精度的问题统一的解决思路是用一个数组去存大整数的每一位数,运算转化为对数组的操作.

可以从个位开始存(逆序),也可以从最高位开始存(顺序),以处理方便为主要考虑因素.

同时可以将大整数定义为一个结构体,包含位数,数组和符号(如有必要).

另外,为了能够进行代码复用,通常采用函数封装的方式.

以本题为例,步骤如下:

1.将a转化为大整数;

2.将a不断自乘;

其中大整数乘法的步骤又分为:

1.遍历两个大整数,每位的数字依次进行普通乘法加到对应的位上;

2.进位.

特别地,可以利用二分法进行进一步优化:

利用 a 2 k = a k ⋅ a k , a 2 k + 1 = ( a k ⋅ a k ) ⋅ a a^{2k}=a^k\cdot a^k,a^{2k+1}=(a^k\cdot a^k)\cdot a a2k=akak,a2k+1=(akak)a 即可.

注意的点:

大整数乘法结果的位数最多位两个大整数的位数之和,这是因为:

1 0 t ≤ m < 1 0 t + 1 ( m 为 t + 1 位 ) , 1 0 s ≤ n < 1 0 s + 1 ( n 为 s + 1 位 ) 10^t≤m<10^{t+1}(m为t+1位),10^s≤n<10^{s+1}(n为s+1位) 10tm<10t+1(mt+1),10sn<10s+1(ns+1), 则 1 0 t + s ≤ m ⋅ n < 1 0 t + s + 2 10^{t+s}≤m\cdot n<10^{t+s+2} 10t+smn<10t+s+2,

所以 m ⋅ n m\cdot n mn 的位数为 t + s + 1 t+s+1 t+s+1 t + s + 2 = ( t + 1 ) + ( s + 1 ) t+s+2=(t+1)+(s+1) t+s+2=(t+1)+(s+1).

代码

代码一:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 95

typedef struct{int cnt,v[N];}BIGINT;

BIGINT carry(BIGINT S,int bin)   //进位 bin表示进制 binary
{
	int flag=0;
	for(int i=0;i<S.cnt;i++)
	{
		int temp=S.v[i]+flag;
		S.v[i]=temp%bin;
		flag=temp/bin;
	}
	return S;
}

BIGINT int2BIG(int x,int bin)  //int 转换(to)成BIGINT 
{
    BIGINT R={0,{0}};
    do
    {
        R.v[R.cnt++]=x%bin;
        x/=bin;
    }while(x>0);
    return R;
}

BIGINT mul(BIGINT S, BIGINT T)     //两个大整数相乘
{
    BIGINT R={S.cnt+T.cnt,{0}};  //位数最多为两者相加
    for(int i=0;i<T.cnt;i++)
    {
        for (int j=0;j<S.cnt;j++)
        {
            R.v[i+j]+=S.v[j]*T.v[i];   //依此进行普通乘法
        }
    }
    R=carry(R,10);
    if(R.v[S.cnt+T.cnt-1]==0) 
	{
		R.cnt--; //最高位0不统计在一个大整数的位数中
	}
    return R;
}

BIGINT pow(BIGINT a, int n)  //计算 a的n次方
{
    BIGINT r=int2BIG(1,10);
    for(int i=0;i<n;i++)
    {
    	r=mul(r,a);
	}
    return r;
}

int main()
{
	int T;
	scanf("%d",&T);
	for(int t=0;t<T;t++)
	{
		int a,n;
		scanf("%d%d",&a,&n);
		printf("case #%d:\n",t);
		BIGINT ans=pow(int2BIG(a,10),n);
		for(int i=ans.cnt-1;i>=0;i--)
		{
			printf("%d",ans.v[i]);
		}
		printf("\n");
	}
}

代码二(优化):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 95

typedef struct{int cnt,v[N];}BIGINT;

BIGINT carry(BIGINT S,int bin)   //进位 bin表示进制 binary
{
	int flag=0;
	for(int i=0;i<S.cnt;i++)
	{
		int temp=S.v[i]+flag;
		S.v[i]=temp%bin;
		flag=temp/bin;
	}
	return S;
}

BIGINT int2BIG(int x,int bin)  //int 转换成BIGINT 
{
    BIGINT R={0,{0}};
    do
    {
        R.v[R.cnt++]=x%bin;
        x/=bin;
    }while(x>0);
    return R;
}

BIGINT mul(BIGINT S, BIGINT T)     //两个大整数相乘
{
    BIGINT R={S.cnt+T.cnt,{0}};  //位数最多为两者相加
    for(int i=0;i<T.cnt;i++)
    {
        for (int j=0;j<S.cnt;j++)
        {
            R.v[i+j]+=S.v[j]*T.v[i];   //依此进行普通乘法
        }
    }
    R=carry(R,10);
    if(R.v[S.cnt+T.cnt-1]==0) 
	{
		R.cnt--; //最高位0不统计在一个大整数的位数中
	}
    return R;
}

BIGINT pow(BIGINT a, int n)  //计算 a的n次方
{
    BIGINT r;
    if(n==0)
	{
		return int2BIG(1,10);	
	}
    else if(n==1)
	{
		return a;	
	}
    r=pow(a, n/2);
    r=mul(r,r);
    if(n%2!=0)  //非偶数 需要多乘一个a 
	{
		r=mul(r, a);
	}
    return r;
}

int main()
{
	int T;
	scanf("%d",&T);
	for(int t=0;t<T;t++)
	{
		int a,n;
		scanf("%d%d",&a,&n);
		printf("case #%d:\n",t);
		BIGINT ans=pow(int2BIG(a,10),n);
		for(int i=ans.cnt-1;i>=0;i--)
		{
			printf("%d",ans.v[i]);
		}
		printf("\n");
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件架构:理解分析三层结构观点

三层结构的简单描述及优点   三层体系结构&#xff0c;即用户层、应用层和数据库服务器。用户层主要指用户界面&#xff0c;它要求尽可能的简单&#xff0c;使最终用户不需要进行任何培训就能方便地访问信息&#xff1b;第二层就是应用服务器&#xff0c;也就是常说的中间件&…

webpack: 4 loader汇总(style-loader等)

所有的loader必须匹配规则&#xff0c;否则不生效 配置文件中&#xff0c;module中rules的use执行顺序是从后往前执行 url-loader 用于将文件转换为base64 URI的webpack加载程序。 options limit limit指定文件大小&#xff0c;小于limit的图片不会生成图片以base64格式被引入…

客观地说,应该看一看 Web3.0 了

武术圈有名言&#xff1a;“八极加劈挂&#xff0c;神鬼都害怕”。要是 Web3.0AGI 的话&#xff0c;世界将会变成什么样子&#xff1f; 数科星球原创作者丨苑晶编辑丨大兔 Web3.0 的价值开始受到重视&#xff0c;在最近&#xff0c;来自香港的好消息再次带火了这个领域的热度。…

VMware NSX-T Data Center 3.2.3 - 数据中心网络全栈虚拟化

VMware NSX-T Data Center 3.2.3 - 数据中心网络全栈虚拟化 重要更新&#xff1a;修复 136 个 bug。 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-nsx-t-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMwa…

ChatGPT 接入飞书教程,创建自己的聊天机器人

ChatGPT 接入飞书教程,创建自己的聊天机器人 一、飞书进入开发者平台。点击创建应用。二、打开Aircode,点击创建应用,上面输入名字,下面选择Node.js v16三、配置环境,点击Environments,创建四个变量,全部要大写本教程收集于: AIGC从入门到精通教程 首先,准备三个账号…

FPGA实现MPEG2视频压缩PCIe传输 提供软硬件工程源码和技术支持

目录 1、前言2、MPEG2视频压缩实现3、我已有的FPGA图像视频编解码方案4、我已有的PCIE方案5、MPEG2视频压缩PCIE传输设计方案FPGA硬件设计软件设计 6、Vivado工程详解7、Linux下的XDMA驱动安装8、上板调试验证9、福利&#xff1a;工程代码的获取 1、前言 MJPEG、MPEG2、MPEG4、…

IOS开发指南之storyboard中控件与变量关联及控件事件与方法关联

1.创建IOS工程 2.选择 interface为storyboard,语言选择Objective-C 打开工程后可看到工程默认添加了两个storyboard文件 Main.storyboard为应用主场景,LaunchScreen为启动屏幕场景 3.双击Main.storyboard打开设计窗口,并拖放控件布局如下 4.为控件添加关联变量与(IBOutlet与I…

身高测量仪红外传感测距模块应用方案 WTU201F2 B004 低功耗

​身高测量仪被广泛用于医疗、教育等领域&#xff0c;而红外测距模块在身高测量仪中的应用则成为了一种新的技术手段。红外测距模块是基于红外线技术的一种测距器件&#xff0c;在身高测量仪中&#xff0c;红外测距模块能够精准地测量出人体的高度。与传统的测量方法相比&#…

品牌如何从零开始运营抖音,带你全面了解

随着短视频逐渐深入我们的生活&#xff0c;巨大的流量吸引了众多人群。很多人因此也想开始做抖音&#xff0c;很多品牌却因为内容制作流程复杂&#xff0c;不知从何入门。今天&#xff0c;和大家分享下品牌如何从零开始运营抖音。 其实在开始一件事情之前&#xff0c;最主要的是…

智能感测离子风棒,托起中国“智”造新高度

智能感测离子风棒采用市面上较为少见的内置感测型离子发生器&#xff0c;能够对外界环境电荷进行快速平衡。该设备智能控制&#xff0c;无需人工点检&#xff0c;达到全自动静电消除并具备异常报警功能。能让ESD管理者或使用者先一步发现问题&#xff0c;快速准确的解决问题 。…

Shell脚本例题

1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和、奇数和 4.用户名存放在users.txt文件中&#xff0c;每行一个&#xff0c;判断文件里的用户是否存在&#xff0c;若该用户存在&#xf…

京喜APP - 图片库优化 | 京东云技术团队

作者&#xff1a;京东零售 何骁 介绍 京喜APP早期开发主要是快速原生化迭代替代原有H5&#xff0c;提高用户体验&#xff0c;在这期间也积累了不少性能问题。之后我们开始进行一些性能优化相关的工作&#xff0c;本文主要是介绍京喜图片库相关优化策略以及关于图片相关的一些…

es 7.0.8 常用DSL语句进行索引crud操作(windows es7.x)

一 es7.x的核心 1.1 es的核心概念 1.ES 里的 Index 可以看做一个库(名称必须为小写)&#xff0c;而 Types 相当于表&#xff0c;Documents 则相当于表的行。 2.这里 Types 的概念已经被逐渐弱化&#xff0c;Elasticsearch 6.X 中&#xff0c;一个 index 下已经只能包含一个…

postgresql数据库linux centos7 安装

简介 &#xff08;百度百科&#xff09; PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只…

Linux基础学习---1、目录结构、Vim编辑器、网络配置和远程登录

1、Linux目录结构 1.1 /bin 是Binary的缩写&#xff0c;这个目录存放着最经常使用的命令。1.2 /sbin s是Super User的意思&#xff0c;这里存放的是系统管理员使用的系统管理程序。1.3 /home 存放普通用户的主目录&#xff0c;在Linux中每个用户都有一个自己的目录&#xff…

海睿思分享 | 浅谈智能数据治理

随着大数据和AI技术的发展&#xff0c;利用企业内外部海量数据进行融合、治理、分析和应用&#xff0c;已成为企业经营管理越来越重要的手段。如何构建企业大数据分析平台发挥数据价值正成为企业数字化转型的核心战略任务。 基于大数据平台进行数据分析的完整流程分为&#xf…

MyBatis--映射关系一对一和MyBatis--映射关系多对一 -都有基于xml和注解的教程

目录 MyBatis--映射关系一对一 映射关系-官方文档 映射关系1 对1-基本介绍 注意细节 映射方式 方式1 创建idencardv 表 创建person表 创建新的 module(mybatis-mapping), 相关配置文件可以从上一个 module 拷贝 创建IdenCard.java对应表类 创建Person.java对应表类…

Vue2相关面试题(持续更新)

前言 目前这套面试题只适合 初级前端&#xff0c;后面会进行深层次补充和拓展以及Vue2源代码的讲解&#xff08;虽然Vue2今年开始不维护了&#xff0c;但是我的面试题不会止步&#xff0c;冲冲冲&#xff09;。在面试的过程中&#xff0c;一定要清楚哪些该说哪些不该说&#x…

云剪辑-B端在线剪辑⼯具架构设计与演进

腾讯云音视频的云剪辑致力于让客户在自己的应用&#xff08;Web、小程序&#xff09;中快速集成剪辑能力&#xff0c;同时强大的模板能力能够极大地提升视频生产效率。我们在探索B端在线剪辑产品的过程中遇到不少挑战&#xff1a;如何满足快速与定制两种集成场景&#xff1f;如…

Linux性能监控

一、htop 安装&#xff1a;yum install htop -ytop是linux下常用的监控程序&#xff0c;htop相当于其加强版&#xff0c;颜色显示不同参数&#xff0c;且支持鼠标操作&#xff0c;相对于top简单和人性化&#xff01;第一行与第二行&#xff0c;显示CPU当前的运行负载&#xff…