【9104】&&【a103】阶乘和
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
已知正整数n(n≤100),设s=1!+2!+3!+...+n!。其中“!”表示阶层,即n!=1*2*3*...*(n-1)*n,如:3!=1*2*3=6。请编程实现:输入正整数n,输出计算结果s的值。
Input
文件输入仅一行,输入n
Output
s的值。
Sample Input
4
Sample Output
33
【题解】
先处理阶乘,这个是高精度乘单精度,然后在一边处理阶乘的时候,一边加起来,即高精度加法。
【代码】
#include <cstdio>
int n,a[300],b[300],la = 1 ,lb = 1; //a数组用于存储阶乘,b数组用于存储当前的阶乘和。
void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= 299;i++) //初始化所有的数字为0
a[i] = 0,b[i] = 0;
a[1] = 1; //0!== 1
}
void get_ans()
{
for (int i = 1;i <= n;i++) //开始获取前n个阶乘的和。
{
int x = 0;
for (int j = 1;j <= la;j++) // 乘上i,同时一边处理进位
{
a[j] = a[j] * i + x;
x = a[j] / 10;
a[j] = a[j] % 10;
}
while (x > 0) //如果这个数的位数还可以变大 就用while让其变大。
{
la++;
a[la] += x;
x = a[la] / 10;
a[la] = a[la] % 10;
}
x = 0;//接下来处理加法
int l;
if (la > lb) //先判断哪一个数比较大,获取他的长度 用于做加法
l = la;
else
l = lb;
for (int j = 1;j <= l;j++) //开始加上去 一边处理进位
{
b[j] = b[j] + a[j] + x;
x = b[j] / 10;
b[j] = b[j] % 10;
}
while (x > 0) //如果可以增加长度则增加长度
{
l++;
b[l] += x;
x = b[l] / 10;
b[l] = b[l] % 10;
}
lb = l; //更新b数组的长度
}
}
void output_ans() //最后b数组逆序输出即可。
{
for (int i = lb;i >= 1;i--)
printf("%d",b[i]);
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}
浙公网安备 33010602011771号