#5 WA,求助各位大佬

P1303 A*B Problem

Legendre @ 2020-02-03 16:23:50

#include <iostream>
using namespace std;
string sa,sb;
int la,lb,lc;
int a[1001],b[1001],c[1001]; 
void printsz(int x[]){
    for (int i=x[0]; i>=1; i--) cout<<x[i];
    cout<<endl;
}
int main()
{
    cin>>sa>>sb;
    la=sa.length();
    lb=sb.length();
    for (int i=0; i<la; i++) a[la-i]=sa[i]-'0';
    a[0]=la;
    for (int i=0; i<lb; i++) b[lb-i]=sb[i]-'0';
    b[0]=lb;
    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];
    int t,jw=0;
    for (int i=1; i<=lc; i++){
        t=c[i]+jw;
        c[i]=t%10;
        jw=t/10;
    }
    while (c[lc]==0 && lc>1) lc--;
    c[0]=lc;
    printsz(c);

    return 0;
}

蒟蒻写的高精,#5 哇了

求助各位大佬

毕竟我本来就讨厌写高精。。。


by 旭日临窗 @ 2020-07-15 12:27:15

@lelele @lelele 你存进a和b的时候是不是有点问题, la - i还要减去1啊,

然后你做乘法的时候可以从0开始啊<=改成<, c[i + j]就行了

进位的时候还有一种方法:

for(int i = 0;i <= la + lb - 2;i++){
        if(c[i] >= 10){
            c[i + 1] = c[i + 1] + c[i] / 10;
            c[i] = c[i] % 10;
        }
    }

lc也有点问题,可以改成:

if(c[la + lb - 1] != 0){
    lc = la + lb;
}
else{
    lc = la + lb - 1;
}

你可以看一下我的代码:

#include <bits/stdc++.h> 
using namespace std;
char a[3000],b[3000];
int c[3000],d[3000];
int h[6010];
int main(){
    cin >> a >> b;
    int s,s2,k;
    s = strlen(a);
    s2 = strlen(b);
    if(s == 1 && a[0] - '0' == 0 || s2 == 1 && b[0] - '0' == 0){
        cout << 0;
        return 0;
    }
    for(int i = 0;i < s;i++){
        c[s - 1 - i] = (a[i] - '0');
    }
    for(int i = 0;i < s2;i++){
        d[s2 - 1 - i] = (b[i] - '0');
    }
    for(int i = 0;i < s;i++){
        for(int j = 0;j < s2;j++){
            h[i + j] += c[i] * d[j];
        }
    }
    for(int i = 0;i <= s + s2 - 2;i++){
        if(h[i] >= 10){
            h[i + 1] = h[i + 1] + h[i] / 10;
            h[i] = h[i] % 10;
        }
    }
    if(h[s + s2 - 1] != 0){
        k = s + s2;
    }
    else{
        k = s + s2 - 1;
    }
    for(int i = k - 1;i >= 0;i--){
        cout << h[i]; 
    }
    return 0;
}

这样就应该没问题了


by 旭日临窗 @ 2020-07-15 12:30:36

@lelele 还有最后一个问题 你数组好像开的不够,题目要求2000位,你只有1000位


|