不会就我一个高精度吧(装X)
2024-07-29 16:37:15
发布于:上海
#include<iostream>
#include<cstring>
using namespace std;
int n,a[105],b[105],c[105],f[105];
int len_a=1,len_b=1,len_c=1,len_ans,m=1;
string s;
int main(){
	cin>>n;
	b[0]=1;//初始化
	for(int i=1;i<=n;i++){
		len_a=0;
		int p=i;
		while(p>0) a[len_a++]=p%10,p/=10;
		for(int j=0;j<len_a;j++){//算a*b(i*(i-1))的阶乘,即i的阶乘 
			for(int k=0;k<=len_b;k++){
				c[j+k]+=a[j]*b[k];
			}
		}
		for(int j=0;j<len_c;j++){
			if(c[j]>9) c[j+1]+=c[j]/10,c[j]%=10; 
		}//进位
		if(c[len_c]) len_c++;//判断最高位是否需要进位
		len_ans=len_b,len_b=len_c;
		m=max(m,len_c);
		//把len_b赋值给len_ans
		for(int j=len_c-1;j>=0;j--) b[j]=c[j];//把c数组存进b数组,即存进i的阶乘 
		len_c=len_a+len_ans;
		memset(c,0,sizeof c);//清零c数组,下一个阶乘 
		for(int j=0;j<m;j++){
			f[j]+=b[j];
			if(f[j]>9){
				f[j+1]+=f[j]/10;
				f[j]%=10;
			}
		}
	}
	while(!f[m]&&m>0) m--;//去掉前导零 
	for(int i=m;i>=0;i--) cout<<f[i];//倒序输出 
	return 0;
}
全部评论 4
- 不写一个函数,不费劲吗 - 2025-01-17 来自 山东 0
- 我也是高精度 
 #include<bits/stdc++.h>
 using namespace std;
 string add(string a, string b);
 string mul(string a, string b);
 string tostr(int a);
 int main() {
 int n;
 cin >> n;
 string sum = "0";
 string xiang = "1";
 for(int i = 1; i <= n; i++) {
 for(int j = 1; j <= i; j++) {
 xiang = mul(xiang, tostr(j));
 }
 sum = add(sum, xiang);
 xiang = "1";
 }
 cout << sum;
 return 0;
 }
 string add(string a, string b) {
 string res = "";
 if(a.length() < b.length()) swap(a, b);
 while(b.length() < a.length()) b = '0' + b;
 int cnt = 0;
 for(int i = a.length() - 1; i >= 0; i--) {
 int aa = a[i] - '0';
 int bb = b[i] - '0';
 int ans = (aa + bb + cnt) % 10;
 res = char(ans + '0') + res;
 cnt = (aa + bb + cnt) / 10;
 }
 if(cnt == 1) res = '1' + res;
 return res;
 }
 string mul(string a, string b) {
 if(a == "0" || b == "0") return "0";
 int la = a.length(), lb = b.length();
 int ans[la + lb] = {};
 string res = "";
 reverse(a.begin(), a.end());
 reverse(b.begin(), b.end());
 for(int i = 0; i < la; i++)
 for(int j = 0; j < lb; j++)
 ans[i + j] += (a[i] - '0') * (b[j] - '0');
 for(int i = 0; i < la + lb; i++) {
 ans[i + 1] += ans[i] / 10;
 res = char(ans[i] % 10 + '0')+res;
 }
 if(res[0] == '0') res.erase(0, 1);
 return res;
 }
 string tostr(int a) {
 string res = "";
 while(a) {
 res = char(a % 10 + '0') + res;
 a /= 10;
 }
 return res;
 }- 2025-01-17 来自 山东 0
- 但厉害  - 2024-12-03 来自 江苏 0
- 没必要 - 2024-12-03 来自 江苏 0









有帮助,赞一个