链接:https://ac.nowcoder.com/acm/contest/1069/C
来源:牛客网
题目描述 :
用高精度计算出S=1!+2!+3!+…+n!(n ≤ 50)其中“!”表示阶乘,例如:5!=54321。
输入描述:
输入正整数N
输出描述:
输出计算结果S
输入
3
输出
9
**思路:**由于50的阶乘比较大,long long 也无法储存,所以用字符串进行储存,进行大数加法和大数乘法;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <string>
#include <iostream>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <string.h>
using namespace std;
char s[10000], d[10000]; //储存从左至右为低位到高位
int p=0, pa=0; //p表示s的最高位,pa表示d的最高位
void che(int k) //大数乘法(d*k)
{
int i, j=0, z; // j表示进位的数值
for(i=0; i<=pa; i++)
{
z=j+(d[i]-48)*k;
if(z>=10)
{
d[i]=z%10+48;
j=z/10;
}
else
{
d[i]=z+48;
j=0;
}
}
while(j)
{
pa=pa+1;
d[pa]=j%10+48;
j=j/10;
}
}
void jia() //大数加法
{
int i, j=0, ma=0; // j表示进位的数值
for(i=0; i<=p||i<=pa; i++)
{
if(j+s[i]-48+d[i]-48>=10)
{
s[i]=j+s[i]-48+d[i]-10;
j=1;
}
else
{
s[i]=j+s[i]-48+d[i];
j=0;
}
}
ma=max(p,pa);
while(j)
{
ma=ma+1;
s[ma]=j%10+48;
j=j/10;
}
p=ma;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<10000; i++) //进行初始化处理;
{
s[i]='0';
d[i]='0';
}
d[0]='1';
for(int i=1; i<=n; i++)
{
che(i); //表示d=i*d;
jia(); //表示s=s+d;
}
for(int i=p; i>=0; i--) //输出s;
{
printf("%c",s[i]);
}
printf("\n");
return 0;
}
谢谢观看,望关注。