目录

【一、题目说明】

【二、解题思路】

【三、解题】


【一、题目说明】

        题目如下所示,介绍了阶乘的计算方式,同时规定了输入数的范围不超过 50、输入输出的格式都为正整数,以及样例——输入 3 输出 9。


【二、解题思路】

计算阶乘数之和可以分为两步进行:

        ① 计算数 n 的阶乘:

        如上图所示,这是我们在纸上进行乘法(*计算的步骤,乘数个位分别与被乘数的个位与十位相乘进项,如上图中进数为 1 ,我们可以通过数组来模拟大数据进行乘法计算,如 sum[0] 个位...等等,而在计算阶乘时我们可以利用 for 循环从 n 一直乘到 1 ,之后在对需要进行的进位进行处理,最后将结果保存后加入到准备好的 sum 相加数组中。

        ② 计算 n 个阶乘的数相加:

        如上图所示,这是我们在纸上进行加法(+)计算的步骤,相同位相加如果大于 10 则进项,如上图中进数为 1 ,我们也可以通过数组来模拟整数的加法运算,相同位相加,如果大于 10 则通过进数记录后在当前位进行取模(%)运算,在下一位相加时加上进数。


【三、解题】

        首先定义数组的长度为 1000,以及两个数组 mlt 表示中进行阶乘的运算,res 中进行相加。

const int max = 1000;
int mlt[max],res[max];

        之后进行第一步操作,计算 n 的阶乘。

int main()
{
	int n;
	std::cin >> n; //相当于 scanf("%d",&n);
	
	mlt[0]=1;
	res[0]=1;
	for(int i=2;i<=n;i++)
	{
		//1.计算n的阶乘
		int carry = 0;
		for(int j=0;j<max;j++){
			mlt[j] = carry + mlt[j] * i;
			carry = mlt[j] / 10; 
			mlt[j] %= 10;
		}
    }
}

        运算前将 mltres 数组的 [0] 位置初始化为 1,接着进行 for 循环 i = 2 ,因为 1 的阶乘仍为 1 ,之后定义 carry 为进数用于记录。第二个 for 循环中按位依次相乘,同时记录进位并将该位记为 % 10 后的结果,相当于取个位,在下一次循环开始时 + carry 相当于再将进数加到前一位,如此往复进行,最终得到 n 的阶乘。

        在前面的基础上我们加上第二步,计算 n 个数阶乘的和。

int main()
{
	int n;
	std::cin >> n;
	
	mlt[0]=1;
	res[0]=1;
	for(int i=2;i<=n;i++)
	{
		//1.计算n的阶乘
		int carry = 0;
		for(int j=0;j<max;j++){
			mlt[j] = carry + mlt[j] * i;
			carry = mlt[j] / 10; 
			mlt[j] %= 10;
		}
		
		//2.计算阶乘的和
		for(int j=0;j<max;j++){
			res[j] += mlt[j];
			res[j+1] += res[j]/10;
			res[j] %= 10;
		}
	}

    return 0;
}

        按照之前的分析,我们再次使用一个 for 循环进行加法运算,依次按位相加,并将当前位除(/) 10 后的数赋给后一位,当前位再对 10 模(%),模拟纸上计算时的进位操作,之后循环往复进行该操作,便可得到最终结果。

-完整代码如下-

#include<iostream>

const int max = 1000;
int mlt[max],res[max];

int main()
{
	int n;
	std::cin >> n; //相当于 scanf("%d",&n);
	
	mlt[0]=1;
	res[0]=1;
	for(int i=2;i<=n;i++)
	{
		//1.计算n的阶乘
		int carry = 0;
		for(int j=0;j<max;j++){
			mlt[j] = carry + mlt[j] * i;
			carry = mlt[j] / 10; 
			mlt[j] %= 10;
		}
		
		//2.计算阶乘的和
		for(int j=0;j<max;j++){
			res[j] += mlt[j];
			res[j+1] += res[j]/10;
			res[j] %= 10;
		}
	}
	
	int len = max;
	while(0 == res[len-1] && len > 1){
		len--;
	}
	
	for(int i=len-1;i>=0;i--){
		std::cout << res[i]; //相当于ptintf("%d",res[i])
	}
	
    return 0;
}

        其中最后再对结果处理后得到 len 长度,通过 for 循环倒序遍历数组输出结果。


如有不足,指出,多多包容( ・´ω`・ )


                                        参考视频 —— >洛谷P1009阶乘之和_高精度

更多推荐