一.题目
二.分析
1.解析函数功能
Mul(a,b);即a=a*b,高精度*单精度
void Mul(int a[],int b){
for(int i=1;i<=a[0];i++)//单精度数b和高精度数a的每一位相乘
a[i]*=b;
for(int i=1;i<=a[0];i++){//处理每一位上的进位
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[a[0]+1]>0){//最高位上如果有进位则位数a[0]增加后继续处理,可根据情况决定是否要分成一位一位的
a[0]++;
a[a[0]+1]=a[a[0]]/10;
a[a[0]]%=10;
}
}
Add(a,b);即a=a+b;高精度+高精度
void Add(int a[],int b[]){//相加模块
if(a[0]<b[0])a[0]=b[0]; //和存储在a数组中,a[0]要保证能加到两个数的最高位
for(int i=1;i<=a[0];i++){
a[i]+=b[i]; //存储和
a[i+1]+=a[i]/10; //处理进位,将进位加到上一位去
a[i]%=10; //去掉进位后的数值。处理进位也可以改成if(a[i]>9) a[i+1]++,a[i]-=10;
}
if(a[a[0]+1]>0) a[0]++; //如果最高位上有进位,则结果位数要加一位
return;
}
三.C语言源码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define N 5005
void Mul(int a[],int b){
for(int i=1;i<=a[0];i++)//单精度数b和高精度数a的每一位相乘
a[i]*=b;
for(int i=1;i<=a[0];i++){//处理每一位上的进位
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[a[0]+1]>0){//最高位上如果有进位则位数a[0]增加后继续处理,可根据情况决定是否要分成一位一位的
a[0]++;
a[a[0]+1]=a[a[0]]/10;
a[a[0]]%=10;
}
}
void Add(int a[],int b[]){//相加模块
if(a[0]<b[0])a[0]=b[0]; //和存储在a数组中,a[0]要保证能加到两个数的最高位
for(int i=1;i<=a[0];i++){
a[i]+=b[i]; //存储和
a[i+1]+=a[i]/10; //处理进位,将进位加到上一位去
a[i]%=10; //去掉进位后的数值。处理进位也可以改成if(a[i]>9) a[i+1]++,a[i]-=10;
}
if(a[a[0]+1]>0) a[0]++; //如果最高位上有进位,则结果位数要加一位
return;
}
int main(){
int a[N],c[N];//c存放最后答案
int n;
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));//存放最终结果
a[1]=1;a[0]=1;
for(int i=2;i<=n;i++)
{
Add(c,a);//c+=a
Mul(a,i);//a=a*i
}
Add(c,a);
for(int i=a[0];i>0;i--) printf("%d",c[i]); //倒序输出每一位,有时候需要处理最高位上有0的情况,具体情况再具体处理
return 0;
}