新手,耗了一个多小时通过的小结C++
查看原帖
新手,耗了一个多小时通过的小结C++
1264899
b1adez楼主2024/1/25 18:47
#include <iostream>
 #include <iomanip>
#include <stdio.h>//printf 
#include <vector>
using namespace std;//省略std::cin的std:: 
	
	
	//大数相加函数 
vector<int> add(vector<int> a,vector<int> b){//a[0]是大数a的低位 
	//确保a是较长的数,若不是则交换ab
	if(a.size()<b.size()){
		return add(b,a);
	} 
	
	vector<int> result; 
	int temp=0;//存储进位和当前位的加法结果
	for(int i=0;i<a.size();i++){//从低到高遍历a的每一位 
		temp = temp +a[i];//此时上一位来的进位,和a的本位已加在一起存在了temp里 
		if(i<b.size()){//如果b这一位存在,加上b的这一位 
			temp = temp +b[i];
		}
		result.push_back(temp%10);//将a[i]和b[i]的运算结果的个位存在result
		temp = temp/10;//temp存储进位 
	}
	return result; 
}

//高精度乘法一般是由一个大数*一个普通数 
vector<int> mutiply(vector<int> &a,int b){
	vector<int> result;
	int temp = 0;//存储进位等临时结果
	for(int i=0;i<a.size();i++){//遍历大数a
		//a[i]*b //加上上一位来的进位,然后结果进位要保存到temp,个位保存到result 
		temp = temp + a[i]*b;//temp保存完整运算结果
		result.push_back(temp%10);//个位保存到result
		temp = temp/10;//计算进位 
		
	}
	while(temp > 0){//最高位进位的处理 
		result.push_back(temp%10);//temp的个位压入result
		temp = temp/10;//舍掉已经压入result的个位数 
	}
	return result;
	 
} 
//由于大数是逆序存储的,故逆序输出 
void print(vector<int> a){
	for(int i=a.size()-1;i>=0;i--){
		cout<<a[i];
	}
}
//阶乘 
vector<int>	JieCheng(int n){
	vector<int> result;
	result.push_back(1);
	for(int i=2;i<=n;i++){
		result = mutiply(result,i);
	}
	return result;
} 


int main(){
	int n;
	cin>>n;
	vector<int> S;
	S.push_back(0);
	
	for(int i=1;i<=n;i++){
		S = add(S,JieCheng(i));
	}
	print(S);
	
	
} 
2024/1/25 18:47
加载中...