gold_boy_hetao @ 2024-06-21 23:04:57
这道题把我搞蒙了,求大佬指点!
#include <iostream>
using namespace std;
int main()
{
long long n,sum = 0,x = 1;
cin >> n;
for (long long i = 1;i <= n;i++)
{
long long j = 1;
while (j <= i)
{
x *= j;
j += 1;
}
sum += x;
x = 1;
}
cout << sum;
return 0;
}
by Nighramet @ 2024-06-21 23:19:49
题目都告诉你要用高精了呢,你猜猜为什么你的程序输出负数。
by Yxy7952 @ 2024-06-22 08:19:24
@gold_boy_hetao
话不多说,直接看题解:
#include<bits/stdc++.h>//万能头文件
using namespace std;
int a[100000],n,i,y,xy[100000],s[100000];//s[0]和a[0]表示两个数组的长度
//s表示答案,a表示阶乘,先算出阶乘,放在a里,再把s和它相加,更新s
void add()//表示s=s+a
{
int i;
memset(xy,0,sizeof(xy));//xy为辅助数组,先将a+s放入xy,再将s更新为xy
xy[0]=max(s[0],a[0]);//更长的为xy数组长度
for (i=1;i<=xy[0];i++)
{
xy[i]+=s[i]+a[i];//将每一位相加
xy[i+1]=xy[i]/10;//进位
xy[i]%=10;//进位
}
while (xy[xy[0]+1]>0) //进位
{
xy[xy[0]+2]=xy[xy[0]+1]/10;
xy[xy[0]+1]%=10;
xy[0]++;
}
s[0]=xy[0];//长度也要更新
for (i=1;i<=xy[0];i++) s[i]=xy[i];//将xy给s
}
int main()//愉快的开始了主程序
{
cin>>n;
a[0]=1;//将数组初值赋好
a[1]=1;//这里一定要是1,不然算阶乘的时候一直为0
s[0]=1;
s[1]=0;
for (y=1;y<=n;y++) //这里是高精度乘法
{
memset(xy,0,sizeof(xy));//xy为辅助数组,先将a+s放入xy,再将s更新为xy
xy[0]=a[0];
for (i=1;i<=a[0];i++)
{
xy[i]+=a[i]*y;//算阶乘
xy[i+1]=xy[i]/10;//进位
xy[i]%=10;
}
while (xy[xy[0]+1]>0)//进位
{
xy[xy[0]+2]=xy[xy[0]+1]/10;
xy[xy[0]+1]%=10;
xy[0]++;
}
for (i=1;i<=xy[0];i++) a[i]=xy[i];//算出y!放入a内
a[0]=xy[0];
add();//进行高精度加法
}
for (i=s[0];i>=1;i--) cout<<s[i];//输出
cout<<endl;//换行
return 0;//愉快的结束了主程序
}