大数阶乘

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

AI 生成测试报告:从 2 小时到 10 分钟

本文分享了AI在汽车电子测试报告生成中的应用案例。作者以某车企ECU测试项目为例,对比传统报告方式(每天2小时)与AI辅助方式(每天20分钟),效率提升83%。文章详细介绍了测试报告的核心要素(测试概况、结果、问题分析、发布建议)和不同类型报告(日报、周报、总结报告)的特点,并提供了从CANoe导出测试数据的Python解析脚本示例。通过AI自动化处理,大幅减少了测试工程师在报告整理上的时间投入,为汽车电子测试工作提供了实用效率提升方案。

小明的博客 444

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

对大数求阶乘

m0_62990162的博客 1130

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 207

阶乘之和 大数阶乘之和

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

Unity游戏开发必备:HybridCLR热更新实战教程(含iOS/Android适配指南)

本文详细介绍了HybridCLR在Unity游戏开发中的热更新实战教程,包括iOS/Android平台适配指南。通过环境配置、项目结构规划、热更新工作流实现等步骤,帮助开发者高效掌握C#热更新技术,解决移动游戏快速迭代的痛点问题。

weixin_29011395的博客 441

【无标题】 Python自动化法律文书撰写

Jinja2是一个功能强大的模板引擎,支持丰富的语法和功能。除了条件判断和循环语句外,Jinja2还支持过滤器、宏、继承等高级特性,非常适合处理复杂的文书模板。

master_chenchen的博客 2063

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

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

m0_59522785的博客 498

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2053

【大数运算】大数的阶乘

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

It's the Climb 828

SKUA-GOCAD入门教程-第六节

DisplayElements窗口是用于浏览和处理项目数据的工具,包含多个数据浏览器,如模型列表、对象、未分类对象、属性数据及资源数据。

江洋大葱的博客 983

射频仿真软件:ADS (Advanced Design System)_(29).ADS脚本编程与自动化

ADS脚本编程为射频设计提供了强大的自动化工具,可以帮助用户实现设计流程的优化、参数扫描和优化、结果分析和报告生成等任务。选择合适的脚本语言(Python、Tcl、AEL)并合理设置ADS环境,可以显著提高设计效率和准确性。通过实际项目中的应用案例,我们可以更好地理解如何利用脚本编程解决复杂的射频设计问题。希望本文对您的ADS脚本编程学习有所帮助。

kkchenjj的博客 2472

N的阶乘【大数阶乘】

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

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

Python爬虫实战:如何通过解析JSON数据抓取抖音视频评论

本文介绍了如何使用Python爬虫抓取抖音视频评论数据。请求头伪造:通过使用随机的User-Agent,模拟真实用户的请求。代理池:使用代理IP来避免被封禁。JSON解析:直接从API接口获取JSON格式的数据,避免了动态加载内容的限制。需要注意的是,抓取网站数据时应遵守网站的爬虫协议,避免过度抓取影响网站性能或违反法律法规。希望本文能够帮助你掌握如何抓取和分析抖音视频评论数据!

2201_76125261的博客 3360

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值