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