高精度阶乘运算

这篇博客探讨了如何处理大整数阶乘运算的问题,由于常规计算方法受限于计算机整数范围,因此介绍了使用高精度计算的方法。具体算法通过模仿小学竖式乘法,逐位相乘并处理进位,确保能够计算大整数的阶乘。示例代码展示了如何用C语言实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">问题描述</div><div class="pdcont" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px; font-family: 宋体, 'Times New Roman'; font-size: 14px; line-height: 22px; color: rgb(51, 51, 51);">  输入一个正整数<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>,输出<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>!的值。<br style="box-sizing: border-box; margin: 0px; padding: 0px;" />  其中<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>!=1*2*3*…*<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>。</div><div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">算法描述</div><div class="pdcont" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px; font-family: 宋体, 'Times New Roman'; font-size: 14px; line-height: 22px; color: rgb(51, 51, 51);">  <span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组<span style="box-sizing: border-box; margin: 0px; padding: 0px;">A</span>来表示一个大整数<span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>,<span style="box-sizing: border-box; margin: 0px; padding: 0px;">A</span>[0]表示<span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>的个位,<span style="box-sizing: border-box; margin: 0px; padding: 0px;">A</span>[1]表示<span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>的十位,依次类推。<br style="box-sizing: border-box; margin: 0px; padding: 0px;" />  将<span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>乘以一个整数<span style="box-sizing: border-box; margin: 0px; padding: 0px;">k</span>变为将数组<span style="box-sizing: border-box; margin: 0px; padding: 0px;">A</span>的每一个元素都乘以<span style="box-sizing: border-box; margin: 0px; padding: 0px;">k</span>,请注意处理相应的进位。<br style="box-sizing: border-box; margin: 0px; padding: 0px;" />  首先将<span style="box-sizing: border-box; margin: 0px; padding: 0px;">a</span>设为1,然后乘2,乘3,当乘到<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>时,即得到了<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>!的值。</div><div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">输入格式</div><div class="pdcont" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px; font-family: 宋体, 'Times New Roman'; font-size: 14px; line-height: 22px; color: rgb(51, 51, 51);">  输入包含一个正整数<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>,<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span><=1000。</div><div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">输出格式</div><div class="pdcont" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px; font-family: 宋体, 'Times New Roman'; font-size: 14px; line-height: 22px; color: rgb(51, 51, 51);">  输出<span style="box-sizing: border-box; margin: 0px; padding: 0px;">n</span>!的准确值。</div><div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">样例输入</div><div class="pddata" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px 0px 0px 2em; font-family: 'Courier New', Courier, monospace; font-size: 14px; color: rgb(51, 51, 51);">10</div><div class="pdsec" style="box-sizing: border-box; margin: 16px 0px 8px; padding: 0px; font-family: 微软雅黑, 黑体, 宋体; font-size: 16px; color: rgb(51, 51, 51);">样例输出</div><div class="pddata" style="box-sizing: border-box; margin: 0px 0px 0px 16px; padding: 0px 0px 0px 2em; font-family: 'Courier New', Courier, monospace; font-size: 14px; color: rgb(51, 51, 51);">3628800</div>
<span style="font-size:24px;">本题欲求n的阶乘,因为n的值过大,导致必须采用高精度乘法运算。因此,我查阅资料,发现高精度乘法运算有三种算法可以实现,分别是基本大数乘法、分治法求解、FFT算法。本题采用第一种方法便于大家理解。</span>
<span style="font-size:24px;">
</span>
<span style="font-size:24px;">本算法的思路模仿小学<span style="color:#ff0000;">竖式乘法运算规则</span>,基本规则如下:</span>
<span style="font-size:32px;">                   1         2           3</span>
<span style="font-size:32px;">X                  1         8           4</span>
<span style="font-size:32px;">--------------------------------------------   </span>
<span style="font-size:32px;">                   4         8        (1)2 </span>
<span style="font-size:32px;">         8      (1)6      (2)4</span>
<span style="font-size:32px;">1        2         3</span>
<span style="font-size:32px;">------------------------------------------- </span>
<span style="font-size:32px;">      (1)1      (1)6      (1)3           2  </span>
<span style="font-size:32px;">1        2         6         3           2</span>

其中,()内的是进位数。

<span style="font-size:24px;">#include <stdio.h>
#define N 100000

int main(void){
	
	int a[N]={0};
	
	int i,j;
	int n;
	scanf("%d",&n);
	
	a[0]=1;
	int h,p;
	p=0;
	for(i=2;i<=n;i++){
		h=0;
		for(j=0;j<=p;j++){<span style="white-space:pre">	</span>//大数乘法
			a[j]=a[j]*i+h;	//每一位相乘
			h = a[j]/10;	//取出进位
			a[j]=a[j]%10;	//保证每一位都是个位数 
		}
		while(h>0){
				a[j]=h%10;
				h/=10;
				j++;
		}
		p=j-1;
	}
	
	for(i=p;i>=0;i--){
		printf("%d",a[i]);
	}
	
	return 0;
}</span>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值