C++高精度运算(大数处理) 加法、乘法、阶乘

1、概述

对大数的处理一般有两种方式一是运用字符串,二是运用数字数组。两种方式各有优劣,字符串输入输出方便但要考虑数字和字母的转化且有尾数限制,而数字数组只能一位一位的输入。

2、思路说明

本次处理,思路源自加法和乘法竖式。

不管是加法还是乘法,都是按位处理。

加法要注意进位,乘法要注意进位和补零。

关于大数处理写过一次后可以反复用,很舒服。

3、代码

#include<iostream>
#include<string.h>
using namespace std;
//字符串倒置
string reverse(string a){
	string c;
	int j=0;	
	for(int i=a.length()-1;i>=0;i--){
		c+=a[i];
	}
	
	return c;
}
//将int转化为string
string IntToStr(int a){
	string num="";
	while(a>0){
		num+=a%10+'0';
		a=a/10;
	}
	num=reverse(num);
	return num;
} 


//加法 
string add(string a,string b){
	a=reverse(a);
	b=reverse(b);
	int i=0;
	int sign=0;
	string num;
	while(a[i]!='\0'&&b[i]!='\0'){
		int z=a[i]+b[i]+sign-'0'-'0';
		if(z>=10){
			z=z%10;
			num+=z+'0';
			sign=1;
		}else{
			num+=z+'0';
			sign=0;
		}
		i++;
	}
	if(a.length()>b.length()){
		while(a[i]!='\0'){
			int z=a[i]-'0'+sign;
			if(z>=10){
				z=z%10;
				num+=z+'0';
				sign=1;
			}else{
				num+=z+'0';
				sign=0;
			}
			i++;
		}
		if(sign!=0){
			num+=sign+'0';
		}
	}
	else if(a.length()==b.length()){
		if(sign!=0){
			num+=sign+'0';
		}
	}
	else if(a.length()<b.length()){
		while(b[i]!='\0'){
			int z=b[i]-'0'+sign;
			if(z>=10){
				z=z%10;
				num+=z+'0';
				sign=1;
			}else{
				num+=z+'0';
				sign=0;
			}
			i++;
		}
		if(sign!=0){
			num+=sign+'0';
		}
	}
	num=reverse(num);
	return num;
}
//乘法 
string mul(string a,string b){
	a=reverse(a);
	b=reverse(b);
	int i=0;
	int sign=0;
	int m=0;
	string num="0";
	string temp="";
	
	for(int i=0;i<b.length();i++){
		temp="";
		sign=0;
		int z=0;
		//补零
		for(int j=0;j<i;j++) temp+='0';

		while(a[z]!='\0'){
			m=(b[i]-'0')*(a[z]-'0')+sign;
			sign=(m-m%10)/10;
			m=m%10;
			temp+=m+'0';
			z++;
		}	 
		if(sign!=0) temp+=sign+'0';
		
		
		temp=reverse(temp);
		
		num=add(num,temp);	
		
	}
	
	return num;
}
//阶乘 
string fact(int a){
	string z="1";
	string temp;
	for(int i=1;i<=a;i++){
		temp=IntToStr(i);
		z=mul(z,temp);
	}
	return z;
}

int main(){
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	string num="0";
	for(int i=1;i<=n;i++){
		num=add(num,fact(i));//对1到n(包括1、n)求阶乘而后相加
	}
	cout<<num;
}

猜你喜欢

转载自blog.csdn.net/hihui1231/article/details/114604898
今日推荐