为什么使用高精度了还是不行

P1009 [NOIP1998 普及组] 阶乘之和

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 当然,如果你不知道怎么用自定义函数,那就没办法了。


上一页 |