#include <bits/stdc++.h> using namespace std; //大数乘法和大数加法 //按照乘法和加法的运算对字符串进行运算 //大数加法 string addString(string a,string b){ int carry=0; //表示进位 string result; //保存结果 int i=a.size()-1; int j=b.size()-1; //记录a和b两个字符串的长度(事实上是最大下标) while(i>=0&&j>=0){ int num=carry+(a[i]-'0')+(b[j]-'0'); //位数低的数相加 result+=num%10+'0'; //化成字符串 carry=num/10; i--; j--; } while(i>=0){ //如果a的位数比b大 int num=carry+(a[i]-'0'); result+=num%10+'0'; carry=num/10; i--; } while(j>=0){ //如果b的位数比a大 int num=carry+(b[j]-'0'); result+=num%10+'0'; carry=num/10; j--; } if(carry>0){ result+=to_string(carry); } reverse(result.begin(),result.end()); //因为低位在高地址,需要逆置 return result; } //大数乘法(x<=10) string mulString(string a,int x){ int carry=0; string result; for(int i=a.size()-1;i>=0;i--){ int num=carry+(a[i]-'0')*x; result+=num%10+'0'; carry=num/10; } if(carry>0){ result+=to_string(carry); } reverse(result.begin(),result.end()); return result; } //组合大数乘法 string MulString(string a,string b){ string result; for(int i=0;i<b.size();i++){ int x=b[b.size()-1-i]-'0'; //获取低位上的整数值 string num=mulString(a,x); //递归,b的每一位都和a相乘 for(int j=0;j<i;j++){ num=mulString(num,10); //根据乘法运算,不同位上的数相加时需要扩大10倍 } result=addString(result,num); //最后将所有位上的乘法结果相加 } return result; } int main(){ int n; while(cin>>n){ string result="1"; for(int i=2;i<=n;i++){ result=MulString(result,to_string(i)); //迭代乘法 } cout<<result<<endl; } return 0; }
把大佬的代码复现了一下,思路太绝啦,结构清晰易懂