计算1+2!+3!+...+n!的和
2024-09-08 19:18:48
计算1+2!+3!+...+n!的和
Code
点击查看代码
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> VI; //动态数组
int n;
VI add(VI &A, VI &B) //高精度加法
{
if (A.size() < B.size()) return add(B, A); //使A长度大于B
VI C; //接收计算结果
int t=0; //保存进位
for (int i = 0; i < A.size(); i ++ ) //以长度长的作循环
{
t += A[i];
if (i < B.size()) t += B[i]; //如果B没有加完
C.push_back(t % 10); //结果mod 10
t /= 10; //进位
}
if (t) C.push_back(t); //结果长度可能长于长度最长的数
return C; //返回结果
}
VI mul(VI &A,int b){ //高精度与低精度乘法
VI C; //接收结果
int t = 0; //保存进位
for(int i = 0; i <= A.size()-1 || t;i++){ //如果没有乘完或者进位不为0
if(i <= A.size()-1)t += A[i] * b; //相乘
C.push_back(t % 10); //结果mod 10
t /= 10; //进位
}
while(C.size() > 1&&C.back() == 0)C.pop_back(); //除去前导0(可能高进度乘0)
return C; //返回结果
}
int main(){
VI A; //每次保存阶乘
VI C; //保存阶乘之和
C.push_back(0); //初始化为0
cin >> n;
for(int i = 1; i <= n; i ++){
A.erase(A.begin(),A.end()); //每次用完要清空
A.push_back(1); //初始化为1再求阶乘
for(int j = i;j >= 1; j--){
A = mul(A,j); //求阶乘
}
C = add(C,A); //阶乘之和
}
for(int i = C.size() - 1; i >= 0; i -- )cout << C[i]; //逆序输出
return 0;
}
最新文章
- selenium之操作ChromeDriver
- zoj 1610
- dd 生成指定大小文件
- Android 使用意图传递数据
- 文件IO一些注意的地方
- SQL Server 2005的XML数据修改语言(XML DML)
- reviewboard搭建
- uva 215 hdu 1455 uvalive5522 poj 1011 sticks
- MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试
- .net mvc的“从客户端中检测到有潜在危险的 Request.Form 值”问题解决
- FIVE1
- java.lang包【Object类】
- Scrapy框架的执行流程解析
- [转]Tor Browser在国内Windows平台下的超详细教程
- 在CentOS 6 的cron/crontab中使用wine运行exe程序
- java(4) 异常
- 文件上传 python
- 使用 Python 读取火狐的 cookies
- JVM-类加载过程(Java类的生命周期)
- [翻译] JHChainableAnimations