网站模板放哪,开发网站用什么语言,怎么让百度收录你的网站,做问卷调查的网站题目描述
用高精度计算出 S1!2!3!⋯n!#xff08;n≤50#xff09;。
其中 ! 表示阶乘#xff0c;定义为 n!n(n−1)(n−2)⋯1。例如#xff0c;5!54321120。
输入格式
一个正整数 n。
输出格式
一个正整数 S#xff0c;表示计算结果。
输入输出样例
输入 #1
3输出…题目描述
用高精度计算出 S1!2!3!⋯n!n≤50。
其中 ! 表示阶乘定义为 n!n×(n−1)×(n−2)×⋯×1。例如5!5×4×3×2×1120。
输入格式
一个正整数 n。
输出格式
一个正整数 S表示计算结果。
输入输出样例
输入 #1
3输出 #1
9
解题分析
思路很简单求出阶乘之后再累次求和即可但是关键在于这个数据量实在是太大了所以必须封装高精度运算这里我们创建一个BigInt类然后重载运算符和*得出答案即可。
这段代码定义了一个 BigInt 类来处理大整数的运算这对于计算大数的阶乘和它们的和是必需的因为标准的整型变量无法存储这么大的数字。接下来我们会逐步解释关键的组成部分尤其是高精度的加法和乘法。
构造函数
BigInt 类有两个构造函数分别接受一个整数和一个字符串作为参数。整数构造函数将整数转换为字符数组字符串表示而字符串构造函数则直接复制给定的字符串到内部字符数组。转换整数时采用逆序存储的方式方便后续的加法和乘法运算。
高精度加法
高精度加法的实现在 operator 函数中。它首先将两个大整数的字符串表示逆序存储到整型数组中然后逐位相加并处理进位。由于加法可能导致结果的位数增加例如999 1 1000因此需要预留足够的空间并在最后处理进位。加法完成后将得到的数字逆序转换成字符串形式得到最终的加法结果。
高精度乘法
高精度乘法的实现在 operator* 函数中。该函数使用了一个简单的乘法运算法则即对于两个数的每一位相乘并将结果累加到正确的位置上。这里同样使用了逆序存储和处理进位。乘法的复杂度较高因为它涉及到双层循环每一位的乘积都需要计算并累加进位。
阶乘与求和
factorial 函数计算给定整数的阶乘通过从 2 乘到 n 的方式使用前面定义的高精度乘法。
在 main 函数中读取用户输入的 n然后从 1 遍历到 n计算每个数的阶乘并使用高精度加法将它们累加起来。最终将结果输出。
示例
对于输入 3计算 1! 2! 3! 的结果
1! 12! 23! 6
因此1! 2! 3! 9。
这段代码通过高精度运算支持了对大数的阶乘及其和的计算解决了标准数据类型无法处理大数运算的问题。 代码实现
#include iostream
#include cstring
#include iomanip
using namespace std;
class BigInt{
public:char s[3000];BigInt(int n){char c;int k0;if(n0){s[0]0;s[1]\0;k1;}while(n){cn%100;s[k]c;n/10;}s[k]\0;for(int i0,jk-1;ij;i,j--){cs[i];s[i]s[j];s[j]c;}}BigInt(const char *s1){strcpy(s,s1);}BigInt operator(const BigInt b){int lenastrlen(s);int lenbstrlen(b.s);int a1[3000],b1[3000],c[3000]{0};for(int i0,jlena-1;ilena;i,j--){a1[i]s[j]-0;}for(int i0,jlenb-1;ilenb;i,j--){b1[i]b.s[j]-0;}int lenlenalenb;int tmp0;for(int i0;ilen;i){c[i]a1[i]b1[i]tmp;tmpc[i]/10;c[i]%10;}char ans[3000];int pos0;for(int ilen;i0;i--){if(c[i]){posi1;break;}}for(int i0,jpos-1;ipos;i,j--){ans[i]c[j]0;}ans[pos]\0;if(pos0){ans[0]0;ans[1]\0;}return BigInt(ans);}BigInt operator*(const BigInt b){int lenastrlen(s);int lenbstrlen(b.s);int a1[3000],b1[3000],c[3000]{0};for(int i0,jlena-1;ilena;i,j--){a1[i]s[j]-0;}for(int i0,jlenb-1;ilenb;i,j--){b1[i]b.s[j]-0;}int lenlenalenb2;int jw;for(int i0;ilena;i){jw0;for(int j0;jlenb;j){c[ij]a1[i]*b1[j]jw;jwc[ij]/10;c[ij]%10;}c[ilenb]jw;}char ans[3000];int pos0;for(int ilen;i0;i--){if(c[i]){posi1;break;}}for(int i0,jpos-1;ipos;i,j--){ans[i]c[j]0;}ans[pos]\0;if(pos0){ans[0]0;ans[1]\0;}return BigInt(ans);}
};BigInt factorial(int n){BigInt ans(1);for(int i2;in;i){ansans*BigInt(i);}return ans;
}int main(){BigInt res(0);int n; cinn;for(int i1;in;i){resresfactorial(i);}coutres.sendl;return 0;
}