大数阶乘

大整数的阶乘 大整数的阶乘题目描述输入输出样例算法描述算法思想代码 题目描述 输入一个正整数n,输出n!的值。 n!的计算公式为: n!=1∗2∗3∗...∗n n!=1*2*3*...*n n!=1∗2∗3∗...∗n 输入 输入包含一个正整数n,n<=1000; 输出 输出n!的准确值 样例 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k 阅读详情

求大数阶乘前要计算下最大数阶乘的位数

以便于知道需要开多大的数组 .

第一种求法 : 
lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1


          =[lgN+lg(N-1)+lg(N-2)+......+lg3+lg2+lg1]+1

+1是为了向上取整,因为结果可能是小数


#include<cstdio>
#include<cmath>
int main()
{
	double sum=0;
	for(int i=1;i<=10000;i++)	// n是10000的情况下 
		sum+=log10(i);
	printf("%d\n",(int)sum+1);
	return 0;
}


第二种求法:运用斯特林公式来计算 n! 的位数

斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。



用Stirling公式计算n!结果的位数时,可以两边取对数,
得: log10(n!) = log10(2*PI*n)/2+n*log10(n/E); 
故n!的位数= log10(2*PI*n)/2+n*log10(n/E)+1(注意:当n=1时,算得的结果为0)

#include<cstdio>
#include<cmath>
#define PI 3.141592654
#define E 2.71828182846 	
int main()
{
	int n,sum=1;
	scanf("%d",&n);
	if(n>3)
		sum=log10(2*PI*n)/2+n*log10(n/E)+1;
	printf("%d\n",sum);
	return 0;
}

求大数阶乘运用的是模拟,也是用一个数组来储存这个阶乘的每一位数


练习题目:http://acm.hdu.edu.cn/showproblem.php?pid=1042


#include<cstdio>
#include<cmath>
#include<cstring> 
int a[35660+5];//储存每一位所得得数 
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		memset(a,0,sizeof(a));
		int temp,dight=1;
		a[0]=1;
		dight=1;//dight是阶乘的位数 
		for(int i=1;i<=n;i++)
		{
			int num=0;//保存需要进位的数 
			for(int j=0;j<dight;j++)
			{
				temp=a[j]*i+num;//temp是每次相乘的结果 
				a[j]=temp%10;
				num=temp/10;//保存需要进位的数
			}
			while(num)
			{
				a[dight]=num%10;//继续储存 
				num/=10;
				dight++;
			}
		}
		for(int i=dight-1;i>=0;i--)//逆序输出每一位 
			printf("%d",a[i]);
		printf("\n");
	}	
	return 0;
}

上边的那一段代码在51nod里https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1057这一道题会TLE

我提交了好多次,才在有一次以 1000ms 通过....


看了别人写的代码,有的100ms内就通过了,简直是我速度的十倍


他们的代码不是让a[i]只保存一位数,而是保存多位,见过一位大佬的,一个a[i]保存了14位数,我也写了一下,140ms过了这道题

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
#define ll long long    
const ll c=1e14;  
ll a[10000000];  
int main()  
{  
    ll n;  
    while(~scanf("%lld",&n))   
    {  
        ll temp;  
        ll dight=1;  
        a[0]=1;  
        for(ll i=1;i<=n;i++)  
        {  
            ll num=0;  
            for(ll j=0;j<dight;j++)  
            {  
                temp=a[j]*i+num;  
                a[j]=temp%c;  
                num=temp/c;  
            }  
            if(num!=0)  
            {  
                a[dight++]=num;  
            }  
        }  
        printf("%lld",a[dight-1]);  
        for(ll i=dight-2;i>=0;i--)  
            printf("%014lld",a[i]);//这样也可以   
//            printf("%0.14lld",a[i]);//这里想不明白为什么要加个.   
        printf("\n");  
    }  
    return 0;  
}  
//这个代码可以计算1e4以内的数,超过这个范围的话数据会溢出,需要在修改一下a[i]的最大储存位数 
//就这段代码而言,a[i]最多储存1e14大小的数,要是在乘个1e5的数,结果是1e19大小,肯定会溢出
//所以测试99999!的时候前边出现了负号。。。 


em.....


Python大法好...一次通过

n=eval(input())
sum=int(1)
for i in range(1,n+1):
    sum=sum*i
print(sum)

当然还有更强的,直接引用函数,78ms过的

import math
n = int(input())
print(math.factorial(n))


看了众多大佬的代码,受益匪浅。共勉之


参考:https://baike.baidu.com/item/%E6%96%AF%E7%89%B9%E6%9E%97%E5%85%AC%E5%BC%8F/9583086

            https://blog.youkuaiyun.com/lisp1995/article/details/52403488

            https://blog.youkuaiyun.com/lisp1995/article/details/52403507

C语言——计算大数阶乘 学过C语言的同学都知道,C语言能表示最大的数就是long double了,但是就算是这样一个数也最多能计算170及以下的阶乘,而对于170以上的大数阶乘却无法用来表示。 因此下面介绍一种来计算大数阶乘的方法。 #include <stdio.h> void Factorial(int n);//声明函数Factorial int main()//主函数,输入n的值 { int... 阅读详情

相关推荐

C++ 模拟大数乘法 以及 大数阶乘

大数乘法 以及 大数阶乘基本概念及背景大数乘法思路代码实现运行结果大数阶乘思路代码实现运行结果最最最重要的总结部分 写在开头: 大数的运算一直以来都是一个具有研究性的问题, 自己动手模拟了一下笔算乘法, 以及由乘法拓展出来的阶乘, 和大家分享一下思路及代码 基本概念及背景 大数: 我们把运算结果超出计算机数据类型范围的数, 称之为大数 (胡扯中) 比如50的阶乘结果是65位, 而 int...

insight2的博客 1033

大数运算(7)——大数阶乘(求阶乘)

对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。 就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要通过字符串的方法,来进行阶乘的运算。 当然,需要注意的是: 我们所求一个数的阶乘,这个数是在int范围内的,5000的阶乘位数是16326位。 其方法是: 首先,我们是可以先求一定范围内的最大

静之吾心的博客 4万+

小白ACM-大数阶乘

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入输入一个整数m(0 输出输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 304140932017133780436126081660647688443

菜菜鸟的成长记录 789

大数运算——求阶乘

大数运算——求阶乘 计算较为大的数字的阶乘使用的方法主要是利用一个辅助存储空间(数组)用于保存两个数字相乘后的每一位的结果。运算的原理就是小学学过的两位数乘法列竖式的每一位的计算过程,实际上就是将一个非常大的数字的乘法换成了两个小数相乘后再相加的过程,需要反复多次运算。 3 5 X 5 6 ————————————————————————— 2 1 0

qq_38060458的博客 970

C++实现——大数阶乘

/* 大数的阶乘: 给定一个整数n,将其阶乘n!值存入到一个数组中。 */#include <iostream> #include <string> #include <cstdio> using namespace std; //n代表要求的N值 k代表最后结果一共有多少位 R代表最后的结果集合 void factorial(int n,int &k,vector<string>&R)

硅谷 7666

MTK眼中6G物理层与无线协议的进化之路

提议统一波束和小区级的测量、报告和切换框架/流程,进一步减少移动性切换过程中的中断,采用可扩展框架/流程,允许在不同移动性场景中进行部分用户设备配置更新以实现快速切换,支持用户设备发起的移动性(同步/切换)以降低延迟和因信令交换导致的失败,设计移动性RS以实现空闲状态下的节能和连接状态下的无缝用户体验,实现5G/6G间的无缝互操作移动性,为固定无线接入(FWA)提供潜在增强,构建统一的跨层移动性框架以降低复杂度、减少中断和失败。为适应多样化的流量类型,需要灵活的帧结构和高层时间对齐。

asd199086的博客 1745

阶乘的进阶——对大数求阶乘

对大数求阶乘

m0_62990162的博客 1130

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 567

阶乘之和 大数阶乘之和

情况一:不考虑大数的情况 算法思想:直接上代码,简单易懂。 代码描述: int fac(int n){ int p=1, sum=0; for(int i=1; i<=n; i++){ p = p*i; sum = sum+p; } printf("%d",sum); return sum; } 情况二:大数阶乘,求...

Lhw_666的博客 1107

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 232

​​手把手教你学PCIE--ATU 的 Bar 匹配模式与地址匹配模式详解​

摘要: ATU(地址转换单元)提供两种地址匹配模式:Bar匹配模式基于PCI设备的BAR寄存器自动映射虚拟地址(只需配置物理基址),适用于标准PCI设备DMA;地址匹配模式需显式配置虚拟与物理地址范围,适合自定义映射场景。核心区别在于匹配依据(BAR自动推导vs人工定义),Bar模式简化配置,地址模式更灵活。

MHD0815的博客 380

【大数阶乘】从阶乘入门到大数阶乘

现在我们来探讨一下数论中的大数阶乘问题。 要了解大数阶乘,首先我们来了解一下普通的阶乘的方法。 1.一般来说第一时间想到的就是利用循环或者是递归 简单列一下代码 for(int i=1;i<=n;i++) ans*=i; 或者 return n*f(n-1); 大家可以思考一下,当n比较大的时候,代码运行的时间会非常大,同时只能计算一个数的阶乘,我计算了10!,但是要求9!的阶乘的话还得再求一遍,数据无法保存,而且又发现10!=9!*10;那么我可不可以开一个数组把每一个数的阶...

m0_59522785的博客 498

小程序真机调试蓝牙可以使用,线上发布版本蓝牙无法使用

小程序提示请打开蓝牙,微信小程序蓝牙无法连接,小程序真机调试蓝牙可以使用,线上版本蓝牙无法使用,测试环境蓝牙正常,开发环境蓝牙正常,发布后蓝牙无法使用

renkai721的专栏 826

【大数运算】大数的阶乘

求大数阶乘的结果值 大致思路: 思路就是以int数组来存储一个Longlong都无法存储的大数。 注意每一位都代表数字中的每位的值,从低位到高位依次存储,比如12就存成[2,1] 阶乘嘛,N!=1*2*3*···*N 需要get到一个点:一个数乘上x,可以认为这个数的每一位都乘上x,只不过要考虑进位的问题。 那么就把temp=当前位*x的值,temp%10赋给当前位,num=temp/...

It's the Climb 828

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1099

学Simulink--基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模示例

本文详细介绍了基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模方法。首先分析了UKF相比EKF在强非线性场景下的优势,包括无线性化误差、计算效率高和鲁棒性强等特点。接着阐述了UKF的核心原理,重点讲解了无迹变换(UT)的三个关键步骤:Sigma点生成、非线性传播和加权统计重构。文章还详细说明了二维机动目标的状态向量定义、非线性状态转移模型和雷达观测模型。 在Simulink实现部分,提供了完整的建模步骤和核心代码,包括目标运动模型、雷达传感器模型和UKF算法模块的实现。通过蛇形机动场景的仿真实

xiaoheshang_123的博客 89

N的阶乘【大数阶乘】

输入N求N的阶乘的准确值。 Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 首先,要确定N的阶乘的数位大概有多少位,这样便于我们去选择合适的算法。 阶乘:要知道它是10的多少次,不妨 当N==10000时,上式值为35660(已经向上取整)。 所以接受的算法,当大数的一位存的是9位数的时候。复杂度就合法了。 #include <iostream> #include <cstdio> #include &...

既然弱小,就只顾变强就是了 644

Python DEAP 库深度解析:从基础架构到高级应用

DEAP 是一个基于 Python 的开源框架,专门用于实现和运行各种进化算法,旨在帮助用户轻松地构建和调整进化算法,用于解决各种优化和搜索问题。本节中,介绍了 DEAP 相较于其它进化计算框架的优势,以及 DEAP 中重要的工具 creator 和 Toolbox。

盼小辉丶的博客 5085

c语言大数阶乘详细,大数阶乘(c语言)

大数阶乘。代码比较简单。#include#include#define MAXN 25000 // 如果你的阶乘N比较大,建议大一点int result[MAXN];int main(){int i,j,n;scanf("%d",&n);// memset函数的作用将某一段内存设置成指定的值// 参数1:内存首地址 参数2:指定的值 参数3:内存大小memset(result,,...

weixin_33489093的博客 1037

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算大数阶乘c语言,C语言大数阶乘运算

C语言大数阶乘运算答案:4信息版本:手机版解决时间 2019-10-06 23:22已解决2019-10-06 05:26求一份计算大数阶乘的代码 从1!一直算到40!不需要相加 输出的时候 是1! = %d\n 2! = %d\n …… 40! = %d\n 每一位数用一个数组元素存储 跪求代码 鼓捣一天没鼓捣出来 请用C代码 求大神指教最佳答案2019-10-06 06:28刚才刚弄过...

weixin_39598472的博客 629

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: HDU_2036改革春风吹满地
下一篇: n!末尾0的个数
陶鸿杰
博客等级 码龄9年 93粉丝 298原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值