首页 > 其他分享 >P1729 计算e

P1729 计算e

时间:2024-05-01 12:34:20浏览次数:7  
标签:输出 10000 P1729 int dfrac sum 枚举 计算

P1729 计算e

题目背景

《爱与愁的故事第二弹·compute》最终章。

自然对数的底数 \(e\) 是一个著名的无理数,其近似值为 \(2.718281828\cdots\) 有计算 \(e\) 的公式如下:

\[e=\sum_{n=0}^{\infty}\frac{1}{n!} \]

其中 \(n!\) 表示 \(n\) 的阶乘,即 \(n!=1\times 2\times 3\times \cdots \times n\)。

题目描述

月落乌啼竟然这么快就回复了圆周率小数点后10000位?!不可能,他肯定求了别人。爱与愁大神再次为难月落乌啼:“帮我算一算 \(e\) 后 \(n(n \le 10000)\) 位,速度!!!”月落乌啼想求别人,结果他发现由于刚才跟你通话已经用完了手机的所有电。关键时刻只能靠自己。如果现在你是他,你会怎么编这个程序?

输入格式

只有一行:\(n\)

输出格式

若干行。

第一行:\(2\).

第二行开始:\(e\) 的小数部分。\(10\) 个数一个空格,\(50\) 个数一次回车。

样例

输入

100

输出

2.
7182818284 5904523536 0287471352 6624977572 4709369995
9574966967 6277240766 3035354759 4571382178 5251664274

提示

\(30\%\) 数据:\(n \le 1000\)
\(100\%\) 数据:\(n \le 10000\)

时限:全部1秒


思路

\(e\) 是一个无理数,要求求出小数点后 \(10000\) 位。观察公式可看出:\(e\) 的值由“\(\dfrac{1}{n!}\)”的值进行累加,其中 \(n\) 是 \(0\) 到 \(10000\) 的整数,累加的过程可以用循环实现。可以想到,当上一步“\(\dfrac{1}{(n-1)!}\)”已经被计算出来,再除以 \(n\),即可得到“\(\dfrac{1}{n!}\)”的值。

将上述思路整理后,得到以下方法:

  1. 由公式得出 \(\dfrac{1}{0!}=1,\dfrac{1}{1!}=1,\dfrac{1}{2!}=0.5\)。\(e\) 的整数位“\(2.0\)”可以直接输出。然后从 \(3\) 开始枚举,使用高精度除法得到“\(0.5\) 除以 \(3\)”的值,将该值运用高精度加法累加到答案中,以此类推,直到循环至 \(n\) 结束。
  2. 由于要得到小数点后 \(10000\) 位,因此高精度算法枚举每一位运算,需要枚举 \(10000\) 位。而计算“\(\dfrac{1}{n!}\)”这一步,\(n\) 也需要枚举到 \(10000\),加上代码中其他常数,时间复杂度超过 \(10^8\)。为了降低时间复杂度,考虑压位高精度,位数的枚举也从原来的 \(10000\) 位降到 \(1250\) 位(代码为了保证精度多枚举了 \(5\) 位),时间复杂度降为原来的 \(\dfrac{1}{8}\)。
  3. 这里采用了“压 \(8\) 位”的方式。由于输出方式位“\(10\) 个数一个空格,\(50\) 个数一次回车”,需要将之前压 \(8\) 位的数字进行整数分离,输出的时候统计输出数字的数量,当累计到 \(10\) 个数字的时候输出空格,\(50\) 个数字的时候换行。

代码

#include <bits/stdc++.h>
#define base 100000000

using namespace std;

const int n = 10000;
long long a[1255], c[1255], x;
int t, len, sum, ans[20];

int main()
{
	a[1] = 5;
	scanf("%d", &len);
	if (n >= 1)
		printf("2.\n");
	if (n >= 2)
		c[1] = 5; // c[1] 只存放一位数,数组 c 的其他位都存放 8 位数
	for (int i = 3; i <= n; i ++ )
	{
		long long x = 0;
		for (int j = 1; j <= 1255; j ++ ) // 高精度除法
		{
			x = x * base + a[j];
			a[j] = x / i;
			x %= i;
		}
		for (int k = 1255; k >= 1; k -- ) // 高精度乘法
		{
			c[k] += a[k];
			c[k - 1] += c[k] / base;
			c[k] = c[k] % base;
		}
	}
	printf("%lld", c[1]); // c[1] 只存放一位数,sum ++
	sum ++; // sum 统计数字个数
	for (int i = 2; sum <= len - 1; i ++ ) // 对每个万进制数整数分离,拆成 8 个一位数
	{
		int p = 8;
		while (c[i])
		{
			ans[p --] = c[i] % 10;
			c[i] /= 10;
		}
		for (int j = 1; j <= 8 && sum < len; j ++ ) // 每 50 个换行,每 10 个空格
		{
			printf("%d", ans[j]);
			sum ++;
			if (sum % 50 == 0)
				printf("\n");
			else if (sum % 10 == 0)
				printf (" ");
		}
		for (int j = 1; j <= 8; j ++ )
			ans[j] = 0;
	}
	return 0;
}

标签:输出,10000,P1729,int,dfrac,sum,枚举,计算
From: https://www.cnblogs.com/IronMan-PZX/p/18169242

相关文章

  • 【网络知识系列】-- 换个角度理解计算机网络
    换个角度理解计算机网络,搭建计网知识框架所谓换个角度,就是从三层物理设备(物理层、数据链路层、网络层)开始,串联起整个网络的工作原理可能有些小伙伴看见物理设备天生就犯困,反手就准备关闭文章,且慢!本文只是简单的介绍这几个设备的功能,并不会涉及复杂的底层硬件原理,不一定严谨,并且......
  • 计算
     #-*-coding:utf-8-*-"""@author:suyue@file:shunongdu.py@time:2024/04/30@desc:"""importnumpyasnpimportpandasaspddf1=pd.read_excel('D:/尺度速度.xls')file_path='D:/NM004-20230627224400-2023......
  • 计算机操作系统
    操作系统(OperatingSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机的工作和资源ShYLie:机基本子系统是整个系统的核心,对整个系统起监督、管理、控制作用,例如进行复杂的信号处理、控制决策、产生特殊的测试信号,控制整个检测过程等等。此外,利用微机......
  • Vue入门到关门之计算属性与监听属性
    一、计算属性1、什么是计算属性计算属性是基于其它属性计算得出的属性,就像Python中的property,可以把方法/函数伪装成属性,在模板中可以像普通属性一样使用,但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数据发生改变时,计算属性才会重新计算,否则会直接返回缓存的......
  • 探索计算机的微观世界
    微机结构,顾名思义,是指计算机系统中的微型结构。它包括了处理器、内存、输入输出设备等各个部件,以及它们之间的连接方式。微机结构的设计和优化对于提高计算机性能、降低能耗具有重要意义。我们来看看处理器。处理器是计算机的核心部件,负责执行程序中的指令。现代处理器通常采用半......
  • 计算机的微机结构
    微机结构主要包括中央处理器(CPU)、存储器、输入/输出接口等部分。CPU是微机的“大脑”,它负责执行指令、进行运算和控制计算机的运行。CPU内部包含了运算器、控制器等重要组件,运算器能够进行各种数学和逻辑运算,控制器则负责指挥和协调各个部件的工作。存储器是计算机用来存储数据......
  • 30 秒出服装设计稿,森马用函数计算+AIGC 整“新活”!
    创新项目如何去赋能我们的业务,这件事情在森马很重要。阿里云函数计算帮我们屏蔽掉了想把AI落地到实际业务场景中GPU算力资源储备、采购成本、技术门槛等很多难题,从而迅速做出决策,快人一步站在正确的起点,体验新技术对整个服装爆款设计、营销链路带来的改变。—— 林建霞 森马......
  • decimal.js 处理浮点数计算
    decimal.js处理浮点数计算:https://blog.csdn.net/Wustfish/article/details/132835178?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-132835178-blog-134384490.235^v43^pc_blog_bottom_relevance_base8&spm=1001.2101.300......
  • 预习一 计算机网络发展史
    计算机网络的发展史可以大致划分为以下几个阶段:起源:1946年,世界上第一台计算机ENIAC在美国诞生。随后的二十多年里,计算机技术一直在寻找与通信技术相结合的发展。20世纪50年代初,美国建立了一个半自动地面防控系统,即SAGE(赛其)系统,这可以看作是网络的雏形。ARPANET阶段:1969年,美国国......
  • 首届超算互联网峰会!天翼云弹性高性能计算E-HPC亮相!
    4月11日,首届超算互联网峰会暨国家超算互联网平台上线仪式在天津顺利举办,来自部委、省级科技厅、中国科学院、中国工程院、计算产业链相关企业等专家、代表数百人共聚一堂,见证了这一历史性时刻。天翼云作为副理事长单位受邀参会,围绕超算领域的前沿技术和应用,与业内专家共同探讨互联......