【数据结构与算法】P1009 [NOIP1998 普及组] 阶乘之和 学习解析
目录
【一、题目说明】
题目如下所示,介绍了阶乘的计算方式,同时规定了输入数的范围不超过 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;
}
}
}
运算前将 mlt 和 res 数组的 [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阶乘之和_高精度
更多推荐







所有评论(0)