2 条题解

  • 4
    @ 2022-12-24 16:30:03

    AC代码(逆置)

    #include <bits/stdc++.h>
    using namespace std;
    const int N=10010;
    const int M=2*N;
    int c[M],a[N],b[N];
    char s1[N],s2[N];
    int alen,blen,tmp;
    int main()
    {
        cin>>s1+1>>s2+1;
        int len1=strlen(s1+1);
        int len2=strlen(s2+1);
        for(int i=len1;i>=1;i--,tmp*=10)
            if((len1-i)%4==0) a[++alen]=s1[i]-'0',tmp=1;
            else a[alen]=(s1[i]-'0')*tmp+a[alen];
        for(int i=len2;i>=1;i--,tmp*=10)
            if((len2-i)%4==0) b[++blen]=s2[i]-'0',tmp=1;
            else b[blen]=(s2[i]-'0')*tmp+b[blen];
        for(int i=1;i<=alen;i++)
            for(int j=1;j<=blen;j++){
                c[i+j-1]+=a[i]*b[j];
                c[i+j]+=c[i+j-1]/10000;//除10000,不是除1000!!!错了好久
                c[i+j-1]%=10000;
            }
        int len=alen+blen-1;
        if(c[len+1]!=0) len++;
    
        for(int i=1;i<=len;i++)
            if(i!=1) printf("%04d",c[len-i+1]);//重点!当遍历到非最高四位时,要保证输出4位,不足4位前面补零
            else cout<<c[len];//最高四位,直接输出,不带0
    	return 0;
    }
    
    • -1
      @ 2023-10-14 20:03:37
      #include <bits/stdc++.h>
      using namespace std;
      const int maxn=500;//由于两个数相乘,结果肯定不是240位,定义500绰绰有余
      char sa[maxn],sb[maxn];
      int a[maxn],b[maxn];
      int c[maxn];
      int main(){
          cin>>sa;
          cin>>sb;
          int la=strlen(sa);
          int lb=strlen(sb);
          memset(c,0,sizeof(c));
          for (int i=0;i<la;i++){
              a[la-i]=sa[i]-'0';
          }	
          for (int i=0;i<lb;i++){
              b[lb-i]=sb[i]-'0';
          }//倒序
          for (int i=1;i<=la;i++){
              for (int j=1;j<=lb;j++){
                  c[i+j-1]+=a[i]*b[j];
              }//计算数值
          }
          int lc=la+lb;
          for (int i=1;i<=lc;i++){
              c[i+1]+=c[i]/10;
              c[i]%=10;
          }//计算进位
          while(c[lc]==0&&lc>1){//由于任何数*0的结果都是0,如果没有判断,啥都没输出,所以要保留一位
              lc--;
          }//去除前导0
          for (int i=lc;i>=1;i--){
              cout<<c[i];
          }//倒序输出
          return 0;
      }
      
      • 1

      [普及][模板]高精度乘高精度

      信息

      ID
      283
      时间
      1000ms
      内存
      16MiB
      难度
      6
      标签
      递交数
      183
      已通过
      59
      上传者