不会就我一个高精度吧(装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
有帮助,赞一个