lijiatu123 @ 2022-10-19 20:31:20
#include<stdio.h>
int main()
{
long n,b=1,a=1,s=0;
scanf("%ld",n);
while(b<=n)
{
a*=b;
b++;
s+=a;
}
printf("%ld",s);
return 0;
}
by char_phi @ 2022-10-19 20:46:16
@chentengqi123 开 long long
试试?
by Wzc_DL24JP @ 2022-10-19 20:47:06
这道题题意是高精度数组模拟数而不是long类型。 小知识:
long=long int =int=32位
long long =uint64_t =64位
by YQsunny @ 2022-10-19 20:48:35
scanf要加取地址符
by Xingxing9191 @ 2022-10-19 20:48:57
测试数据都特别大,我用过unsigned long long也没有通过。 高精度算法如下 (请参考,但不要Ctrl+C):
#include<iostream>
using namespace std;
int a[2000];
int b[2000];
int c[2000];
int sum[2000];
void plus(int *a,int *c)
{
int jw=0;
for(int i=1;i<=1000;i++)
{
c[i]+=a[i]+jw;
jw=c[i]/10;
c[i]%=10;
}
}
void multiply(int *a,int c)
{
int jw=0;
for(int i=1;i<=1000;i++)
{
a[i]=a[i]*c+jw;
jw=a[i]/10;
a[i]%=10;
}
}
int main()
{
int n;
cin>>n;
a[1]=1;
for(int i=1;i<=n;i++)
{
multiply(a,i);
pplus(a,c);
}
bool flag=0;
for(int i=1000;i>=1;i--)
{
if(c[i]!=0) flag=1;
if(flag) cout<<c[i];
}
}
by CH_mengxiang @ 2022-10-19 20:51:58
你可以百度一下,用数组模拟高精度怎么写,然后慢慢地就会了。
by ud2_ @ 2022-10-19 21:01:02
假设内存无限,高精度运算是指对取值范围无限的数的运算。int
/ long
之类内置类型取值范围有限,不能称为高精度。
如果初学高精度运算,那么用小学学过的竖式来做这道题。采用十进制或者 2⁶⁴ 进制都可以。
似乎有人不知道 CCF 的算法竞赛不允许使用 long
。评测机上 long
宽 64 位,但 CCF 的规定是 64 位整数只能使用 long long
。
by YGB_XU @ 2022-10-19 21:17:59
@liuxy1234
不是指楼主……
by UTAsriel @ 2022-10-21 16:37:17
给你点好东西(我自己定义的)
void getf/*高精度scanf()*/(int gjd[]){
char gjdzf[1000];
memset(gjd,0,sizeof(int)*1001);
scanf("%s ",gjdzf);
gjd[0]=strlen(gjdzf);
for(int bla=1;bla<=gjd[0];bla++){
gjd[bla]=gjdzf[gjd[0]-bla]-'0';
}
return;
}
void putf/*高精度printf()*/(int gjd[]){
for(int bla=gjd[0];bla>=1;bla--){
printf("%d",gjd[bla]);
}
return;
}
void eval/*高精度 a=b */(int c[],int b[]){
for(int a=0;a<900;a++){
c[a]=b[a];
}
return;
}
void setf/*高精度 a=b (b为低精度)*/(int a[],int b){
int c;
for(int x=1;x<900;x++){
a[x]=0;
}
a[1]+=b;
for(int y=1;y<900;y++){
a[y+1]+=a[y]/10;
a[y]=a[y]%10;
if(a[y]!=0){
c=y;
}
}
a[0]=c;
return;
}
void mult/*高精度 a*=b (b为低精度)*/(int a[],int b){ int c;
for(int x=1;x<=a[0];x++){
a[x]*=b;
}
for(int y=1;y<900;y++){
a[y+1]+=a[y]/10;
a[y]=a[y]%10;
if(a[y]!=0){
c=y;
}
}
a[0]=c;
return;
}
void plus/*高精度a+=b*/(int a[],int b[]){
int c;
for(int x=1;(x<=a[0])||(x<=b[0]);x++){
a[x]+=b[x];
}
for(int y=1;y<900;y++){
a[y+1]+=a[y]/10;
a[y]=a[y]%10;
if(a[y]!=0){
c=y;
}
}
a[0]=c;
return;
}
by UTAsriel @ 2022-10-21 16:38:45
@UTAsriel 当然,如果你不知道怎么用自定义函数,那就没办法了。