求阶乘之和(高精度)

一道来自洛谷的求阶乘之和的题

由于题目中给出的数据范围较大,即使用 long long 也会造成数据溢出,所以要用到高精度的运算.
学习了高精度运算之后就知道,可以用数组来储存范围大的整数,于是,这道题我就是将数据从1开始依次相乘,每乘一次就将结果保存尽数组当中,然后与前一次乘积结果相加以达到高精度求和的目的.
以下是我写的代码.

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100;
int a[MAXN], b[MAXN], c[MAXN];//a 储存本次乘积结果, b 储存上次乘积结果,c 储存 a和b之和;
int len = 1; // 数据长度;
void sum()
{
	for (int i = 0; i <= len; i++)
	{
		c[i] += a[i] + b[i]; //对每一位进行求和;
		c[i + 1] += c[i] / 10;// 模拟加法进位;
		c[i] %= 10;
	}
	if (c[len])//最后进位可能会导致位数增加;
		len++;
}
void mp(int y) 
{
	memset(b, 0, sizeof(b));//初始化数组 b;
	for (int i = 0; i < len; i++)
	 {
	 	a[i] *= y;	// 让 a 数组中每一位数都乘上 y,完成高精度数和整型数的乘积;
	 }
	 for (int i = 0; i < len; i++) // 模拟乘积后的进位.
	 {
	 	a[i+1] += a[i] / 10;
	 	a[i] %= 10;
	 }
	 int x = a[len];
	 while (x) // 重置长度 len,使数组每一位都是个位数;
	 {
	 	a[len] = x % 10;
	 	x /= 10;
	 	len++;
	 }
	 sum();
	 for (int i = 0; i <= len; i++)
	 	{
	 		b[i] = a[i];
		 }
 } 
int main ()
{
	int n;
	a[0] = 1;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		mp(i);
	}
	for (;!c[len];)//重置长度,保留有效长度;
		len--;
	for (int i = len; i >= 0; i--)
		cout << c[i];
	return 0;
		
} 
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值