描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
样例输入
5
样例输出
153
分析
数据类型表达不了像50!这样大的数,故必须用到数组,使数据的每一位相加,推荐大家先去看一下高精度的计算这篇文章http://t.csdn.cn/5IZMJ
本题需要用到大数阶乘和大数加法的结合,先算出来阶乘,然后每算出来一次,就加上,最后输出。
代码
#include<stdio.h>
#include<string.h>
int main()
{
int n, i, j, k;
int len = 1; //表示阶乘数组位数
int length1 = 1; //结果数组位数
int arr[100],sum[100];
memset(arr, 0, sizeof(arr)); //初始化为0
memset(sum, 0, sizeof(sum));
arr[0] = 1; //第一位默认为1
scanf("%d", &n);
for (i = 1; i <= n; i++) //得出n的阶乘的和
{
//求阶乘
for (j = 0; j < len; j++)
{
arr[j] *= i; //这个最后自己手写一遍,清晰明了
}
for (j = 0; j < len; j++)
{
if (arr[j] >= 10)
{
arr[j + 1] += arr[j] / 10;
arr[j] %= 10; //更新arr[j]的值
}
while (arr[len]) //若阶乘数组位数产生了进位,如从3(一位数)到12(两位数)
{
arr[len + 1]+=arr[len] / 10;
arr[len] %= 10;
len++; //数组位数增加一位
}
}
//阶乘累加
length1 = len; // lenth1表示结果数组位数
for (k = 0; k < len; k++)
{
sum[k] += arr[k]; //每一位相加
if (sum[k] >= 10)
{
sum[k + 1] += sum[k] / 10;
sum[k] %= 10;
}
while (sum[length1]) //若结果数组位数产生了进位
{
sum[length1 + 1] += sum[length1] / 10;
sum[length1] %= 10;
length1++;
}
}
}
for (i = length1 - 1; i >= 0; i--)
{
printf("%d", sum[i]);
}
return 0;
}