大数乘法

把大数变成字符串和小数相乘, 其实乘法规则和手算乘法是一样的

  • 从低位向高位累乘
  • 进位可能上百上千,因此要对进位取模一个要点是结果和上一步的进位要先相加再取模
  • 超过字符串长度的进位最后单独添加
  • 因为是从低位向高位做乘法,所以最后要用algorithm的reverse();
#include<string>
#include<algorithm>
using namespace std;
string mul_string(string res,int n){
    int carry=0;
    int temp=0;
    for(int i=0;i<res.length();i++){
        temp = (res[i]-'0')*n;
        if(carry==0){
            res[i]=temp%10+'0';
        }
        else{
            res[i]=(temp+carry)%10+'0';//加起来可能要进位,所以先加再模
        }
        carry=(carry+temp)/10;
    }
    while(carry!=0){
        res.append(to_string(carry%10));
        carry/=10;
    }
    return res;
}
int main(){
    int n;
    while(cin>>n){
        string res="1";
        for(int i=2;i<=n;i++){
            res=mul_string(res,i);
        }
        reverse(res.begin(),res.end());
        cout<<res<<endl;
    }
}