大数阶乘

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

Ubuntu单系统安装全攻略:从删除Windows到UEFI引导设置(避坑指南)

本文提供Ubuntu单系统安装的完整指南,涵盖从安全删除Windows系统到UEFI引导设置的详细步骤。通过专业工具准备、分区方案设计、引导加载器配置等关键环节,帮助用户避免常见安装问题,实现纯净高效的Ubuntu单系统环境。特别强调UEFI引导的深度配置与安装后的性能优化,适合希望彻底转向Linux的用户。

weixin_29210727的博客 409

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

对大数求阶乘

m0_62990162的博客 1130

手把手教你用Matlab为PMSM电流环设计2P2Z补偿器(附与PI对比)

本文详细介绍了如何使用Matlab的controlSystemDesigner工具为永磁同步电机(PMSM)电流环设计2P2Z补偿器,并与传统PI控制器进行性能对比。通过频域分析和时域仿真,展示了2P2Z补偿器在提升带宽、减少超调等方面的优势,为高性能伺服驱动和精密运动控制提供了实用解决方案。

weixin_42551227的博客 377

阶乘之和 大数阶乘之和

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

Cesium+Three.js融合实战:从零构建GIS与BIM一体化场景

本文详细介绍了如何将Cesium与Three.js进行技术融合,从零构建GIS与BIM一体化场景。通过环境配置、核心场景搭建、坐标转换、性能优化及交互处理等实战步骤,阐述了Cesium负责宏观地理空间渲染、Three.js处理微观精细BIM模型的协同方案,为智慧城市、数字孪生等应用提供关键技术实现路径。

weixin_29230865的博客 460

6 赫斯曼网管软件industrial hivision用户管理

文章目录前言一、打开Industrial HiVision服务器二、在用户管理界面添加策略三、使用可选策略四、接受策略总结 前言 安装 Industrial HiVision 后,所有人都能广泛使用程序。安全起见,请进行相 关配置,对访问权限进行限制。 本文主要介绍用户管理基于某种角色模型。在访问角色中定义角色名称,通过分配访问权限给这些角色分配角色功能。例如,给管理人员自然要分配可用的权限,而观察员尽管可以登录,但没有能够进行更改的权限。Industrial HiVision 提供以下访问角色: 

t98746194的博客 1381

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

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

m0_59522785的博客 498

使用项目管理画布启动项目

许多人对商业模式画布并不陌生,它是亚历山大·奥斯特瓦德(Alexander Osterwalder)、伊夫·皮尼厄(Yves Pigneur)在《商业模式新生代》(Business Model Generation)中提出的一种用来描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。 在我们做敏捷软件项目inception(项目启动规划)的时候经常会用到商业画布,此时它的作用是帮助我们快速了解客户的业务、产品和市场,帮助客户梳理自己的资源、优势和盈利模式,总的来说,商业画布是一种简单实用的

IDEAL Garden 1224

【大数运算】大数的阶乘

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

It's the Climb 828

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

Lammps实现单轴压缩-应力应变曲线以及弹性模量计算

Lammps实现单轴压缩-应力应变曲线以及弹性模量计算

Rockyoung 1万+

N的阶乘【大数阶乘】

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

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

CD-SSB和NCD-SSB相关内容

NR中,PSS/SSS 和PBCH总是绑定的,因此也称为SSB block。频域由下往上,第121个SC(k = 120)的中心频率,就是SSB的GSCN对应的SSREF(同步参考频率)的出处如上,同步栅格映射到SSB 的RE位置是10个PRB的位置,然后指向RE index 0,即第121个子载波的中心频率;UE获得N_offset_GSCN后,即可结合当前SSB的GSCN推算下一个SSB的GSCN =N_Reference_GSCN(当前SSB的GSCN) + N_offset_GSCN。

asd199086的博客 3430

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值