[高精度加法和乘法] 阶乘之和

题目描述

用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。

其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。

输入格式

一个正整数 n。

输出格式

一个正整数 S,表示计算结果。

输入输出样例

输入 #1

3

输出 #1

9
解题分析

思路很简单,求出阶乘之后再累次求和即可,但是关键在于这个数据量实在是太大了,所以必须封装高精度运算,这里我们创建一个BigInt类,然后重载运算符+和*,得出答案即可。

这段代码定义了一个 BigInt 类来处理大整数的运算,这对于计算大数的阶乘和它们的和是必需的,因为标准的整型变量无法存储这么大的数字。接下来,我们会逐步解释关键的组成部分,尤其是高精度的加法和乘法。

构造函数

BigInt 类有两个构造函数,分别接受一个整数和一个字符串作为参数。整数构造函数将整数转换为字符数组(字符串表示),而字符串构造函数则直接复制给定的字符串到内部字符数组。转换整数时,采用逆序存储的方式,方便后续的加法和乘法运算。

高精度加法

高精度加法的实现在 operator+ 函数中。它首先将两个大整数的字符串表示逆序存储到整型数组中,然后逐位相加,并处理进位。由于加法可能导致结果的位数增加(例如,999 + 1 = 1000),因此需要预留足够的空间并在最后处理进位。加法完成后,将得到的数字逆序转换成字符串形式,得到最终的加法结果。

高精度乘法

高精度乘法的实现在 operator* 函数中。该函数使用了一个简单的乘法运算法则,即对于两个数的每一位相乘,并将结果累加到正确的位置上。这里同样使用了逆序存储和处理进位。乘法的复杂度较高,因为它涉及到双层循环,每一位的乘积都需要计算并累加进位。

阶乘与求和

factorial 函数计算给定整数的阶乘,通过从 2 乘到 n 的方式,使用前面定义的高精度乘法。

main 函数中,读取用户输入的 n,然后从 1 遍历到 n,计算每个数的阶乘,并使用高精度加法将它们累加起来。最终,将结果输出。

示例

对于输入 3,计算 1! + 2! + 3! 的结果:

  1. 1! = 1
  2. 2! = 2
  3. 3! = 6

因此,1! + 2! + 3! = 9

这段代码通过高精度运算支持了对大数的阶乘及其和的计算,解决了标准数据类型无法处理大数运算的问题。

代码实现
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
class BigInt{
public:
	char s[3000];
	BigInt(int n){
		char c;
		int k=0;
		if(n==0){
			s[0]='0';
			s[1]='\0';
			k=1;
		}
		while(n){
			c=n%10+'0';
			s[k++]=c;
			n/=10;
		}
		s[k]='\0';
		for(int i=0,j=k-1;i<=j;i++,j--){
			c=s[i];
			s[i]=s[j];
			s[j]=c;
		}
	}
	BigInt(const char *s1){
		strcpy(s,s1);
	}
	BigInt operator+(const BigInt &b){
		int lena=strlen(s);
		int lenb=strlen(b.s);
		int a1[3000],b1[3000],c[3000]={0};
		for(int i=0,j=lena-1;i<lena;i++,j--){
			a1[i]=s[j]-'0';
		}
		for(int i=0,j=lenb-1;i<lenb;i++,j--){
			b1[i]=b.s[j]-'0';
		}
		int len=lena+lenb;
		int tmp=0;
		for(int i=0;i<len;i++){
			c[i]=a1[i]+b1[i]+tmp;
			tmp=c[i]/10;
			c[i]%=10;
		}
		char ans[3000];
		int pos=0;
		for(int i=len;i>=0;i--){
			if(c[i]){
				pos=i+1;
				break;
			}
		}
		for(int i=0,j=pos-1;i<pos;i++,j--){
			ans[i]=c[j]+'0';
		}
		ans[pos]='\0';
		if(pos==0){
			ans[0]='0';
			ans[1]='\0';
		}
		return BigInt(ans);
	}
	BigInt operator*(const BigInt &b){
		int lena=strlen(s);
		int lenb=strlen(b.s);
		int a1[3000],b1[3000],c[3000]={0};
		for(int i=0,j=lena-1;i<lena;i++,j--){
			a1[i]=s[j]-'0';
		}
		for(int i=0,j=lenb-1;i<lenb;i++,j--){
			b1[i]=b.s[j]-'0';
		}
		int len=lena+lenb+2;
		int jw;
		for(int i=0;i<lena;i++){
			jw=0;
			for(int j=0;j<lenb;j++){
				c[i+j]+=a1[i]*b1[j]+jw;
				jw=c[i+j]/10;
				c[i+j]%=10;
			}
			c[i+lenb]=jw;
		}
		char ans[3000];
		int pos=0;
		for(int i=len;i>=0;i--){
			if(c[i]){
				pos=i+1;
				break;
			}
		}
		for(int i=0,j=pos-1;i<pos;i++,j--){
			ans[i]=c[j]+'0';
		}
		ans[pos]='\0';
		if(pos==0){
			ans[0]='0';
			ans[1]='\0';
		}
		return BigInt(ans);
	}
};

BigInt factorial(int n){
	BigInt ans(1);
	for(int i=2;i<=n;i++){
		ans=ans*BigInt(i);
	}
	return ans;
}


int main(){
	BigInt res(0);
	int n; cin>>n;
	for(int i=1;i<=n;i++){
		res=res+factorial(i);
	}
	cout<<res.s<<endl;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Kotlin知识汇总(四)Kotlin 协程实践

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程是一种并发设计模式&#xff0c;可以在 Android 平台上让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理&#xff0c;例如网络调用、本地数据访问等任务的管理。 简单来说&#xff0c;协程就是一种轻量级的非…

Windows从0到1部署项目

文章目录 1.创建虚拟机2.文件的传输--共享文件夹共享文件夹的访问 3.安装jdk&#xff0c;Tomcat3.1jdk的安装与配置配置环境变量 3.2Tomcat的安装与配置 4.安装mysql数据库5.下载nginx6.虚拟域名 因为Windows项目部署有很多操作都是博主之前做过的了&#xff0c;所及就只放了博…

何恺明教授在MIT的第一课,双语字幕1080P看resnet作者亲自讲解resnet

这几天AI圈最火的话题莫过于何恺明大神在MIT的首场教学了 何恺明&#xff08;Kaiming He&#xff09;教授于3月7日走上讲台&#xff0c;完成了他在麻省理工学院的首场教学&#xff0c;这标志着他教学生涯中的一个重要时刻。作为麻省理工学院电气工程与计算机科学系&#xff08…

批处理自动找木马文件路径

背景&#xff1a;如果主机不多&#xff0c;应急有通报的木马病毒样本可能存在的路径&#xff0c;一个个翻就太累。 直接整成一个文档&#xff0c;如果存在那个可以着重主机了。当然木马查杀记录也不能忘记看下。 1. 双击打开 cmd.bat 2. 输入list.bat 3. 文件存在输出路径…

SQLiteC/C++接口详细介绍之sqlite3类(四)

上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;三&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09;&#xff08;暂未发表&#xff09; 编写不易&#xff0c;有用的朋友点个赞或加粉一下万分感谢&#xff01;300…

three.js 按键W前进、S退后、A左转、D右转运动

效果&#xff1a;W 键 前进&#xff1b;S 键后退&#xff1b;A 键左转&#xff1b;D 键右转&#xff1b;使用了 tween.js 动画库&#xff1b; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left">&…

ctfshow-XXE(web373-web378)

目录 XXE&#xff08;外部实体注入攻击&#xff09; web373 web374 web375 web376 web377 web378 知识点 XXE&#xff08;外部实体注入攻击&#xff09; XXE这几关有个前提flag在根目录下文件名为flag web373 <?php error_reporting(0); libxml_disable_entity_…

商铺办理房产证需缴纳的交易费用有哪些材料?

一、商铺办理房产证收费标准 一般来说&#xff0c;商铺办理房产证时需要缴纳的交易费用包括&#xff1a;交易费、登记费、验资费、营业税、个人所得税、契税等。 每个城市的缴费标准会有所不同。 具体缴纳费用需要咨询当地房管局。 1、契税&#xff1a;房屋交易额的5%。 &…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…

Linux: 预备

计算机结构基础 由于速度原因, CPU不直接与外设打交道, 而是通过内存进行交互.(CPU速度 >> 外设) 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统封装了用户操作接口 相比于系统接口,使用更简单跨平台性: 不同的操作系统,其系统调用接口是不同…

代码随想录 贪心算法-难度题目-其他题目

目录 53.最大子数组和 134.加油站 968.监控二叉树 53.最大子数组和 53. 最大子数组和 中等 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个…

(SUB)app性能测试

APP性能测试(启动速度、内存、CPU、FPS、GPU、耗电量)_性能测试中fps分析-CSDN博客 app性能测试_app性能测试方案-CSDN博客 测试方案 服务端 平均响应时间 错误率 吞吐量 CPU/内存占用率 网络/硬盘的读写速度 客户端 启动速度 手机APP的启动时长是一个很容易被用户感…

【数据库】Oracle内存结构与参数调优

Oracle内存结构与参数调优 Oracle 内存结构概览oracle参数配置概览重要参数&#xff08;系统运行前配置&#xff09;:次要参数&#xff08;可在系统运行后再优化调整&#xff09;: Oracle数据库服务器参数如何调整OLTP内存分配操作系统核心参数配置Disabling ASMM&#xff08;禁…

JSON基础知识

目录 一、定义二、作用三、特点四、语法JSON具有以下这些形式&#xff1a;4.1 对象(JSONObject)&#xff1a;4.2 数组(JSONArray)&#xff1a;4.3 值4.4 字符串4.5 数值 五、常用的JSON解析方式5.1 org.json解析5.1.1 常用api5.1.2 get方法与opt方法对比5.1.3 使用示例5.1.3 参…

面试不再愁,看这份保姆级简历写作指南

在现代社会&#xff0c;简历是求职过程中至关重要的一环。一份精心设计的简历可以为你打开求职的大门&#xff0c;让你脱颖而出。然而&#xff0c;许多求职者常常陷入简历写作的困境&#xff0c;不知道从何处入手。在这篇文章中&#xff0c;我将手把手地教你如何写一份引人注目…

Jmeter接口自动化-如何解决请求头Content-Type冲突问题

一、前言 通常我们在使用Jmeter做接口自动化时&#xff0c;在线程组里添加HTTP信息头管理器&#xff0c;用来管理公共的请求头信息。普通的接口自动化是没问题的&#xff0c;但是对于有些特殊的操作流程&#xff0c;如&#xff1a;先上传文件接口&#xff08;信息头使用Conten…

openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息

文章目录 openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息240.1 背景信息240.2 操作步骤 openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息 在数据库中&#xff0c;统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造…

01 THU大模型之基础入门

1. NLP Basics Distributed Word Representation词表示 Word representation: a process that transform the symbols to the machine understandable meanings 1.1 How to represent the meaning so that the machine can understand Compute word similarity 计算词相似度 …