<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>