c++高精度求任意数的阶乘(详解)

前言

自己在学习这一块的时候,没看到有比较详细的文章来介绍这个内容的,所以打算自己写下,方便大家学习,大家在学习了这个之后,也可以自己练习下高精度加法和乘法,拓宽一下

代码讲解

总体思路: 就是和普通的阶乘一样,迭代的求解,比如说1*2*3*4*5一步一步的来,到后面数据会大到现有的数据类型接受不了,所以整体的话,是采用一个数组保存结果,记住这个数组保存的是整个结果的逆序状态,比如结果是123,数组中前三个元素就是3、2、1其余都是0,其实整个问题就转化为了一个高精度的数乘以一个普通的数结果如何表示的问题

核心问题说明

举例: 计算321*11
如果结果数组为result[10]的话,因为逆序保存,所以此时result[10]={1,2,3,0,0,0,0,0,0,0},如图:
核心说明
由图可以说明,最终得到的结果即为正常结果的逆序,我们逆序输出就可以得到正常结果,这也就解决了高精度数乘以普通的数如何表示的问题

代码部分

#include<iostream>
using namespace std;
int main(void)
{
	int result[2000] = { 0 };
	int n;
	int i,j,m,jing;//jing表示进位
	cin >> n;
	result[0] = 1;//0的阶乘是1
	for (i = 1; i <= n; i++)
	{
		jing = 0;
		for (j = 0; j < 2000; j++)
		{
			m = result[j] * i + jing;
			result[j] = m % 10;
			jing = m / 10;
		}//进行如上图操作
	}
	for (i = 1999; i >= 0; i--)
	{
		if (result[i])
			break;
	}//找出逆序输出的起点,即逆序第一个不为0的数
	for (j = i; j >= 0; j--)
		cout << result[j];//输出结果
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jiuzhongxian_/article/details/107922799