大佬!!求解这个代码注释中的问题
查看原帖
大佬!!求解这个代码注释中的问题
1614135
hzj_0319楼主2024/12/31 21:35
//题目描述
//用高精度计算出 
//S=1!+2!+3!+...+n!(n≤50n≤50)。
//其中 ! 表示阶乘,定义为 
//n!=n×(n-1)×(n-2)×...×1。例如,5!=5×4×3×2×1=120。
//输入格式
//一个正整数 n
//输出格式
//一个正整数 S,表示计算结果。
//输入输出样例
//输入 
//3
//输出
//9
//说明/提示
//【数据范围】
//对于 100% 的数据,1≤n≤50

#include <bits/stdc++.h>//万能头文件
using namespace std; //标准空间:使用同名函数
string high_precision_multiplication(const char *a_1,const char *b_1){
	vector<int> a;
    vector<int> b;
    vector<int> c;
	int lena = strlen(a_1),lenb = strlen(b_1);
	for (int i = 0;i < lena;i++){
		a.push_back(a_1[lena - i - 1] - '0');
	}
	for (int i = 0;i < lenb;i++){
		b.push_back(b_1[lenb - i - 1] - '0');
	}
	for (int i = 0;i < lena;i++){
		int t1 = 0;
		for (int j = 0;j < lenb;j++){
			int index = i + j;
            if (index >= c.size()) {
                c.push_back(0);
            }
			int temp = c[index] + a[i] * b[j];
			t1 = temp / 10;
			int t0 = temp % 10;
			c[index] = t0;
			//--------------------------------------
			if (index + 1 < c.size()){
				c[index + 1] += t1;//为什么这里要+=t1,不能=t1吗?? 
			}else{
				c.push_back(t1);
			}
			//------------------------------------------
		}
	}
	//下面这一行这样写结果对的,但lenc = c.size() - 1;循环条件c[lenc] == 0 && lenc > 0却少了一位有效数字,这是为什么?? 
	//------------------------------------------- 
	int lenc = c.size();
	while (lenc - 1 > 0 && c[lenc - 1] == 0){
		lenc--; 
	}
	//----------------------------------------------
	
	
	
//	//输出 
//	for (int i = lenc;i >= 0;i--){
//		cout << c[i];
//	}
//	cout << endl;
	
	// 将结果存入静态字符数组并返回
    static char result[105];
    for (int i = 0; i < lenc; i++) {
        result[lenc - i - 1] = c[i] + '0'; // 将数字转换为字符
    }
    result[lenc] = '\0'; // 添加字符串结束符

    return result; 
}
string high_precision_addition(const char *a_1,const char *b_1){
	vector<int> a;
	vector<int> b;
	vector<int> c;
	int lena = strlen(a_1),lenb = strlen(b_1);
	for (int i = 0;i < lena;i++){
		a.push_back(a_1[lena - i - 1] - '0');
	}
	for (int i = 0;i < lenb;i++){
		b.push_back(b_1[lenb - i - 1] - '0');
	}
	int lenc = max(lena,lenb);
	
	int temp = 0,t1 = 0,t0 = 0;
	for (int i = 0;i < lenc;i++){
		if (i >= a.size()){
			a.push_back(0);
		}
		if (i >= b.size()){
			b.push_back(0);
		}
		if (i >= c.size()){
			c.push_back(0);
		}
		temp = a[i] + b[i] + c[i];
		t1 = temp / 10;
		t0 = temp % 10;
		c[i] = t0;
		if (i + 1 < c.size()){
			c[i + 1] = t1; 
		}else{
			c.push_back(t1);
		}
	}
	//注释下面---之间的代码---后结果对的,但没注释却少了一位有效数字,这是为什么?? 
	//--------------------------- 
//	if (c[lenc] == 0){
//		lenc--;
//	} 
	//------------------------
	if (c[lenc] != 0){
		lenc++;
	}
//	//输出 
//	for (int i = lenc;i >= 0;i--){
//		cout << c[i];
//	}
//	cout << endl;
	// 将结果存入静态字符数组并返回
    static char result[105];
    for (int i = 0; i < lenc; i++) {
        result[lenc - i - 1] = c[i] + '0'; // 将数字转换为字符
    }
    result[lenc] = '\0'; // 添加字符串结束符
    return result; 
	
}
int main(){ // 主函数入口
//	char a1[50],b1[50];
//	cin >> a1 >> b1;
//	cout << high_precision_multiplication(a1,b1) << endl;
//	cout << high_precision_addition(a1,b1);
	int n;
	cin >> n;
	string temp = "1";
	string sum = "0";
	for (int i = 1;i <= n;i++){
		string t = to_string(i);
//		cout << temp << "*";
		temp = high_precision_multiplication(temp.c_str(),t.c_str()); 
//		cout << t << "=" << temp << endl;
//		cout << sum << "+" << temp << "=";
		sum = high_precision_addition(sum.c_str(),temp.c_str());
//		cout << sum << endl;
	}
	cout << sum;
	return 0; //C++所有函数的结尾加上;
}
2024/12/31 21:35
加载中...