大数阶乘

大整数的阶乘 大整数的阶乘题目描述输入输出样例算法描述算法思想代码 题目描述 输入一个正整数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

复现基于PYNQ-Z2的手写数字识别卷积加速器设计

来源雪天鱼。

eachanm的博客 968

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

对大数求阶乘

m0_62990162的博客 1130

华为昇腾Ascend C中级认证考试-tanh

注册昇腾社区账号后可以免费领券考试。

2600_96284887的博客 471

阶乘之和 大数阶乘之和

情况一:不考虑大数的情况 算法思想:直接上代码,简单易懂。 代码描述: 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

deepfake detection数据集

最全Deepfake数据集总结,包含各个数据集下载链接: https://github.com/deepfakeinthewild/deepfake_in_the_wild Dataset name Download Generate method Deepfake videos Actors Deepfake-TIMIT low download De...

where_is_horse的博客 1万+

浏览器缓存导致代码不更新?一招解决部署后用户仍看到旧页面的问题

方案效果适用场景文件名哈希永久解决前端工程化项目HTTP缓存头控制精准控制需服务器权限Meta标签部分生效临时补救方案最佳实践:入口HTML禁用缓存,静态资源使用哈希文件名 + 长期缓存,达到「秒级更新」+「高性能」的平衡!

江拥羡橙的博客 810

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

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

m0_59522785的博客 498

用 ABAP EML 驾驭 RAP 业务对象:从事务缓冲区到落库提交的一条龙实践

摘要:ABAP EML(Entity Manipulation Language)是SAP RAP框架的核心语言能力,为ABAP开发者提供强类型、批处理友好的方式操作RAP业务对象。EML通过事务缓冲区管理数据变更,支持读取(READ ENTITIES)、修改(MODIFY ENTITIES)及事务控制(COMMIT/ROLLBACK ENTITIES)。其特点包括:基于BDEF派生类型确保类型安全,%control和%cid等特殊字段实现精细控制,统一的消息模型便于错误处理。相比传统ABAP数据访问方式,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 952

【大数运算】大数的阶乘

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

It's the Climb 828

MFC Windows 程序设计[105]之彩色滚动条(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 518

Ubuntu22.04安装ros(一键搞定)

然后发现可以一键安装,话不多说,直接终端输入如下指令。回车之后系统会自动安装ros。

m0_47313541的博客 7413

N的阶乘【大数阶乘】

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

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算大数阶乘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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值