描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
#include<stdio.h>
#include<string.h>
#define N 66
void change(int arr[],int n)
{
for(int i=0;i<n/2;i++)
{
int temp=arr[i];
arr[i]=arr[n-1-i];
arr[n-1-i]=temp;
}
}
void ni(int arr[],int n)
{
int flag=1;
for(int i=n-1;i>=0;i--)
{
if(flag&&arr[i]!=0)
{
flag=0;
}
if(!flag)
{
printf("%d",arr[i]);
}
}
if(flag)
{
printf("0");
}
}
//逆序打印,并且不打印前面的0(数组设置较大,会有不必要的0)
void add(int a[][N],int n)
{
int arr[N];
for(int i=0;i<N;i++)
{
arr[i]=0;
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<N;j++)
{
arr[j]=arr[j]+a[i][j];
arr[j+1]+=arr[j]/10;
arr[j]=arr[j]%10;
}
}
ni(arr,N);
}
void jie(int a[],int n)
{
int temp1=0,temp;
for(int i=2;i<=n;i++)
{
for(int j=0;j<N;j++)
{
a[j]*=i;
temp=a[j]/10; //利用临时变量存储这一次的十位
a[j]=a[j]%10; //只保留个位
a[j]+=temp1; //上一次存储的十位用来进位
temp+=a[j]/10; //应对出现进位后又满十的情况
a[j]=a[j]%10;
temp1=temp; //全部执行完后,存储这一次的十位,防止对本次造成影响
}
}
}
int main()
{
int a[50][N];
int n;
scanf("%d",&n);
a[0][0]=0;
for(int i=1;i<=n;i++)
{
a[i][0]=1;
}
for(int i=n+1;i<=50;i++)
{
a[i][0]=0;
}
for(int i=0;i<50;i++)
{
for(int j=1;j<N;j++)
{
a[i][j]=0;
}
}
//数组初始化
for(int i=0;i<=n;i++)
{
jie(a[i],i);
}
add(a,n);
}