高精加和高精乘的函数没有问题,但过不了,求助,感谢感谢感谢!!!

P1009 [NOIP1998 普及组] 阶乘之和

QYlucky @ 2023-08-17 17:19:37

#include<iostream>
using namespace std;
string cheng(string s1,string s2){//高精乘 
    int a[100000],b[100000],c[100000]; 
    string ans="";
    int la,lb,lc;
    la=s1.length();
    lb=s2.length();
    for(int i=0;i<la;i++){
      a[la-i]=s1[i]-'0';
    }
    for(int i=0;i<lb;i++){
      b[lb-i]=s2[i]-'0';
    }
    lc=la+lb;
    for(int i=1;i<=la;i++){
    for(int j=1;j<=lb;j++){
        c[i+j-1]+=a[i]*b[j];
        c[i+j]+=c[i+j-1]/10;
        c[i+j-1]%=10;
       }
   }
   while(c[lc]==0&&lc>1) lc--;
   for(int i=lc;i>=1;i--){
        ans+=c[i]+'0';
   } 
   return ans;  
}
string jia(string a,string b)//高精加 
 {
     string ans;
     int na[100000]= {0},nb[100000]= {0};
     int la=a.size(),lb=b.size();
     for(int i=0; i<la; i++)//a倒置放入na数组 
         na[la-1-i]=a[i]-'0';
     for(int i=0; i<lb; i++)//b倒置放入nb 
         nb[lb-1-i]=b[i]-'0';
     int lmax=la>lb?la:lb;
     for(int i=0; i<lmax; i++){
        na[i]+=nb[i];
        na[i+1]+=na[i]/10;//进位 
        na[i]%=10;//进位后余下的 
     }     
     if(na[lmax])
         lmax++;
     for(int i=lmax-1; i>=0; i--)//把结果赋值给字符串ans 
         ans+=na[i]+'0';
     return ans;
 }
int main(){
    int n;
    cin>>n;
    string a="1";
    string ans="0";
    for(int i=1;i<=n;i++){
        string b="";
        if(i<10) b=i+'0';
        else{
            b=i/10+'0';
            b+=i%10+'0';
        }   
        a=cheng(a,b);
        ans=jia(ans,a);
    }
    cout<<ans<<endl;
    return 0;
}

by YMnRb @ 2023-08-17 19:08:22

还嘴硬说高精加和高精乘的函数没有问题
高精加函数都把数组全部初始化为0了,高精乘怎么就忘了啊

// 略去上文
string cheng(string s1,string s2){ 
    int a[100000],b[100000],c[100000]={}; 
// 略去下文

a 和 b 不用初始化是因为下文这段代码起到了初始化的作用:

for(int i=0;i<la;i++){
    a[la-i]=s1[i]-'0';
}
for(int i=0;i<lb;i++){
    b[lb-i]=s2[i]-'0';
}

by YMnRb @ 2023-08-17 19:12:14

反而高精加函中无需将数组nanb初始化,因为下文也有一段代码起到了初始化的作用 @QYlucky


by zhouzihang3 @ 2023-08-17 19:39:35

@YuanJiayan 用int数组是不是好点,能用memset还可以省略转化


by YMnRb @ 2023-08-17 19:51:28

@ZE_WY 你是说直接把高精度函数参数类型改为int数组吗?如果是的话,我想说几点:

  1. 用字符串输出更方便;
  2. 如果是全部初始化为 0,那么使用={}和调用memset完全是等效的,时间应该也相差不大;
  3. 如果要省略转化,我会选择直接全部用string,毕竟输出方便;
  4. 既然楼主已经这么写了,要改反而容易改错,我认为还是保持原样好.

by YMnRb @ 2023-08-17 20:04:42

@ZE_WY 而且这也与代码习惯有关吧,有些人喜欢全用int,有些人喜欢全用string,也有人喜欢用char数组,还有些人喜欢intstring混用。

\text{代码的内容不重要,实现的方式不重要,能}\color{green}\text{AC}\color{black}\text{才最重要。}

——沃茨基·硕德


by QYlucky @ 2023-08-18 15:25:28

@YuanJiayan 感谢!!!


by zhouzihang3 @ 2023-08-18 19:02:15

@YuanJiayan 《我自己·说的(方言++)》


|