C++洛谷题解(34)——P1009
题目信息
题名:阶乘之和
题目:用高精度计算出 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 //万能头
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并初始化为0for (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;//还是声明jwfor (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;//声明ncin >> n;//输入na[1] = 1;//a[1]设为1for (int i = 1; i <= n; i++)//遍历1~n{cheng(a, i);//用函数pplus(a, c);//用函数x2}bool flag = 0;//创建bool的flag,初始化为0for (int i = 1000; i >= 1; i--)//倒叙{if (c[i] != 0)//如果c[i]!=0flag = 1;//flag=1if (flag)//否则cout << c[i];//直接输出}system("pause");return 0;//结束
}
复制版:
#include
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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
