题目信息
题名:阶乘之和
题目:用高精度计算出 S = 1! + 2! + 3! + ··· + n! (n ≤ 50)其中 ! 表示阶乘,定义为n! = n × (n - 1) × (n - 2) × ··· × 1。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。
输入格式:一个正整数 n。
输出格式:一个正整数 S,表示计算结果。
输入样例:3
输出样例:9
说明提示:对于 100% 的数据,1≤n≤50。注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20,使用书中的代码无法通过本题。如果希望通过本题,请继续学习第八章高精度的知识。
分析题目
这道题如果光是阶乘没有高精度就很简单,只可惜它有高精度,是《深入浅出基础篇》这本书中的代码的升级版,这样难度就直接翻倍了!
由于这道题相对其他题目而言很难,涉及到后面高精度的知识,所以这次的分析会长一点:
- 创建a,b,c,sum四个数组
- 创建函数pplus,具体内容在下面
- 创建函数cheng,具体内容也在下面
- 主函数内具体内容还在下面
好了,先来说一下pplus函数的内容:
- 函数参数那里写的是int *a,int *c,形参上面创建的数组
- 声明变量jw,并初始化为0
- 遍历1~1000之间的数,用for循环
- 然后是高精度的处理,这里不多说了,直接亮一下代码:
-
c[i] += a[i] + jw;
jw = c[i] / 10;
c[i] %= 10;
然后说一下cheng函数的内容,这个函数和pplus差不多:
- 函数参数写的是int *a,int c,注意,c前面不要加*
- 再次声明变量jw,并初始化为0
- 还是遍历1~1000之间的数,用for循环
- 仍就是高精度的处理,这里不多说了,直接亮一下代码:
-
a[i] = a[i] * c + jw;
jw = a[i] / 10;
a[i] %= 10;
代码与上面虽然差不多,但还是不同。最后是主函数部分:
- 声明变量n并输入
- 特别设置a[1]=1
- 遍历1~n之间的所有数,用cheng(a,i);和pplus(a,c);输入
- 创建bool类型的flag,初始化为0,即False
- 倒叙遍历1~1000之间的数
- 如果c[i]!=0就将flag设为1,即True
- 否则直接输出c[i]
至此,代码分析完成!
示例代码
注释版:
#include <bits/stdc++.h>//万能头
using namespace std;
int a[2000];//声明的
int b[2000];//a,b,c,sum
int c[2000];//四个数组并
int sum[2000];//设为2000
void pplus(int *a, int *c)//创建pplus函数
{
int jw = 0;//声明jw并初始化为0
for (int i = 1; i <= 1000; i++)//遍历1~1000
{
c[i] += a[i] + jw;//高精度
jw = c[i] / 10;//数据
c[i] %= 10;//操作
}
}
void cheng(int *a, int c)//创建的cheng函数
{
int jw = 0;//还是声明jw
for (int i = 1; i <= 1000; i++)//遍历1~1000
{
a[i] = a[i] * c + jw;//依旧是
jw = a[i] / 10;//高精度
a[i] %= 10;//数据操作
}
}
int main()
{
int n;//声明n
cin >> n;//输入n
a[1] = 1;//a[1]设为1
for (int i = 1; i <= n; i++)//遍历1~n
{
cheng(a, i);//用函数
pplus(a, c);//用函数x2
}
bool flag = 0;//创建bool的flag,初始化为0
for (int i = 1000; i >= 1; i--)//倒叙
{
if (c[i] != 0)//如果c[i]!=0
flag = 1;//flag=1
if (flag)//否则
cout << c[i];//直接输出
}
system("pause");
return 0;//结束
}
复制版:
#include <bits/stdc++.h>
using namespace std;
int a[2000];
int b[2000];
int c[2000];
int sum[2000];
void pplus(int *a, int *c)
{
int jw = 0;
for (int i = 1; i <= 1000; i++)
{
c[i] += a[i] + jw;
jw = c[i] / 10;
c[i] %= 10;
}
}
void cheng(int *a, int c)
{
int jw = 0;
for (int i = 1; i <= 1000; i++)
{
a[i] = a[i] * c + jw;
jw = a[i] / 10;
a[i] %= 10;
}
}
int main()
{
int n;
cin >> n;
a[1] = 1;
for (int i = 1; i <= n; i++)
{
cheng(a, i);
pplus(a, c);
}
bool flag = 0;
for (int i = 1000; i >= 1; i--)
{
if (c[i] != 0)
flag = 1;
if (flag)
cout << c[i];
}
system("pause");
return 0;
}