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;
}