【C++新手向】高精度阶乘和的做题感想

本人蒟蒻一枚,欢迎帮助,欢迎与我讨论微笑

有参考https://blog.csdn.net/qq_38863969/article/details/74167538

感谢这位大大以及我身边的学长的帮助

这篇博客主要是对我做题目的一些感想以及详解(以防以后忘记),也可以帮助一下以后的学弟学妹们

由于面向新手,我自己也是新手,所以很多地方有疏漏,或者太繁琐

基本上是在前辈们的基础上对程序进行的解析,补充说明

放题

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=5*4*3*2*1。

输入正整数N,输出计算结果S。

输入

一个正整数N。

输出

计算结果S。

样例输入

5

样例输出

153


放代码

/*涉及自定义函数的知识*/
/*请先了解高精加,高精乘*/ 
#include<bits/stdc++.h>
using namespace std;
int ans[105]/*阶乘和*/,jc[105]/*阶乘*/,jc1=100/*阶乘在数组中的位置*/,ans1=100/*阶乘和在数组中的位置*/;
void pjc()//这个函数计算目前阶乘的最高位在数组中是第几个。
{
	int i=1;
	while(!jc[i])/*等价于(jc[i]==0)*/ i++;//如果非k[i]的话就执行,也就是说,当k[i]=0时,执行语句 
	jc1=i;//这个循环是在读前导0.比如0020前面有2个前导0,则20的最高位2在整个数组中是第3位 
}
void pans()//和上面原理一样,读的是ans的 
{
	int i=1;
	while(!ans[i]) i++;
	ans=i;
}
void ljq()//这个函数是阶乘的累加器,此处运用高精乘 
{
	for(int i=100;i>=jc1;i--)//注意阶乘的个位是在第100位,从i开始循环就是从个位开始加。直到加到最高位所在的数位为止 
	{
		ans[i]+=jc[i];//累加器加上阶乘一次得到的数 
		ans[i-1]+=ans[i]/10;//累加器前一位进的位是后一位的数除以10 
		ans[i]%=10;//后一位进位完只剩余数 
	}
	pans()//然后用pans函数读ans的位置; 
}
/*主函数*/ 
int main()
{
	int n;
	scanf("%d",&n);//输入 
	ans[100]=1;//从100开始存。注意50的阶乘只有65位
	jc[100]=1;//第一次阶乘从1开始
	/*此处为高精乘*/ 
	for(int i=2;i<=n;i++)//第一次乘的数是2 
	{
		for(int j=100;j>=ans1;j--)//每一位都乘一遍i 
		  jc[j]*=i;//循环累乘 
		for(int j=100;j>=ans1;j--)//阶乘进位 
		{
			jc[j-1]+=jc[j]/10;
			jc[j]%=10; 
		}
		pjc();//用这个函数读阶乘的位置 
		ljq();//把本次阶乘的结果存入累加器  
	}
	for(int i=ans1;i<=100;i++)
	  printf("%d",ans[i]);//顺序输出 
	return 0; 
 } 
 
 

猜你喜欢

转载自blog.csdn.net/JaneSilver/article/details/80777357