关于总是输出0

P1009 [NOIP1998 普及组] 阶乘之和

Miracle1024 @ 2023-04-19 22:39:04

闰土(猹?),输入什么都一直输出0

做不出来我会洗掉的啦

//1~n的阶乘和
#include<iostream>
using namespace std;
typedef long long ll;
short a[114]={0},b[114]={0},k=0,sa[114];
void bclr(void){//清空数组b
    for(int i=0;i<114;i++){
        b[i]=0;
    }
}
void saclr(void){//清空数组sa
    for(int i=0;i<114;i++){
        sa[i]=0;
    }
}
int len(void){//a、b长度最大值
    for(int i=113;i>=0;i--){
        if(a[i]!=0||b[i]!=0){
            return i;
        }
    }
}
int alen(void){//啊的长度
    for(int i=113;i>=0;i--){
        if(a[i]!=0){
            return i;
        }
    }
}
int blen(void){//别的长度
    for(int i=113;i>=0;i--){
        if(b[i]!=0){
            return i;
        }
    }
}
void add(void){//a加上b的和存储在a内
    k=len();
    for(int i=1;i<=k;i++){
        a[i]+=b[i];
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;

    }
    while(a[k+1]){
        k++;
    }
}
void badd (short ss){//把短整型ss加到b数组上
    short i=1;
    while(ss!=0){
        b[i]+=ss%10;
        b[i+1]+=b[i]/10;
        i++;
        ss/=10;
    }
}
void mult(short s){//把a数组加上
    saclr();
    b[1]=1;
    short i=1,t=s;
    if(s==0){
        return;
    }
    while(s){
        sa[i]+=s%10;
        s/=10;
        i++;
    }

    for(int h=1;h<=blen();h++){
        for(int j=1;j<=i;j++){
            a[h+j-1]+=sa[j]*b[h];
        }
    }//乘法运算

    for(int i=1;i<=k;i++){
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;
    }//进位

    while(a[k]==0){
//      cout<<k<<" "<<a[k]<<endl;//这句测试用的,注释掉了
        k--;
    }//去前导零
    mult(s--);
    return;
}
int main(){
//  freopen("doc.in","r",stdin);
//  freopen("doc.out","w",stdout);
    short n,kx;
    cin>>n;
    for (short i=1;i<=n;i++){
        bclr();
        mult(i);
        add();
        for(int i=113;i>=1;i--){
            cout<<b[i]<<" ";
        }
        cout<<endl;
    }
    for(int i=alen();i>=1;i--){
        cout<<a[i];
    }
    return 0;
}

哼啊啊啊啊不会做救救我嘤嘤嘤


by Miracle1024 @ 2023-04-20 20:28:48

改了但全错

//1~n的阶乘和
#include<iostream>
using namespace std;
typedef long long ll;
short a[114]={0},b[114]={0},k=0,sa[114];
void bclr(void){//清空数组b
    for(int i=0;i<114;i++){
        b[i]=0;
    }
}
//void saclr(void){//清空数组sa
//  for(int i=0;i<114;i++){
//      sa[i]=0;
//  }
//}
int len(void){//a、b长度最大值
    for(int i=113;i>=0;i--){
        if(a[i]!=0||b[i]!=0){
            return i;
        }
    }
}
int alen(void){//啊的长度
    for(int i=113;i>=0;i--){
        if(a[i]!=0){
            return i;
        }
    }
}
int blen(void){//别的长度
    for(int i=113;i>=0;i--){
        if(b[i]!=0){
            return i;
        }
    }
}
//void add(void){//a加上b的和存储在a内
//  k=len();
//    for(int i=1;i<=k;i++){
//        a[i]+=b[i];
//        a[i+1]+=a[i]/10;
//        a[i]=a[i]%10;
//
//    }
//    while(a[k+1]){
//        k++;
//    }
//}
//void badd (short ss){//把短整型ss加到b数组上
//  short i=1;
//  while(ss!=0){
//      b[i]+=ss%10;
//      b[i+1]+=b[i]/10;
//      i++;
//      ss/=10;
//  }
//}
void mult(short s){//把a数组加上
//  saclr();
    b[1]=1;
    short i=1,t=s;
    if(t==0){
        return;
    }
//  while(t){
//      sa[i]+=t%10;
//      t/=10;
//      i++;
//  }

//    for(int h=1;h<=blen();h++){
//      for(int j=1;j<=i;j++){
//          a[h+j-1]+=sa[j]*b[h];
//      }
//  }//乘法运算

    for(int h=1;h<=blen();h++){
        a[h]+=t*b[h];
    }//乘法运算

    for(int i=1;i<=k;i++){
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;
    }//进位

    while(a[k]==0){
//      cout<<k<<" "<<a[k]<<endl;//这句测试用的,注释掉了
        k--;
    }//去前导零

    mult(s-1);
    return;
}
int main(){
//  freopen("doc.in","r",stdin);
//  freopen("doc.out","w",stdout);
    short n,kx;
    cin>>n;
    for (short i=1;i<=n;i++){
        bclr();
        mult(i);
//      add();
 }
    for(int i=alen();i>=1;i--){
        cout<<a[i];
    }
    return 0;
}

|