萌新刚学OI,不会,求助,第五个点WA了

P1303 A*B Problem

⚡进击_蒟蒻⚡ @ 2019-12-05 08:21:43

#include<bits/stdc++.h>
using namespace std;
int i,j,c[2005],a[2005],b[2005],la,lb,w;
string s1,s2;
int main() 
{
    cin>>s1;
    cin>>s2;
    la=s1.size();
    lb=s2.size();
    for(i=0;i<la;i++) a[la-i]=s1[i]-48;
    for(i=0;i<lb;i++) b[lb-i]=s2[i]-48;
    for(i=1;i<=la;i++)
        for(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;
          }
    w=la+lb;
    while(c[w]==0&&w>1) w--;
    for(i=w; i>=1; i--) cout<<c[i];
    return 0;
}

by BeyondHeaven @ 2019-12-05 08:27:20

NTT (逃


by tiger0133 @ 2019-12-05 08:53:45

不应该开到 4005 么


by _StarBird_ @ 2019-12-05 09:40:39

最高位进位进不上去


by _StarBird_ @ 2019-12-05 09:42:23

c[i+j]+=c[i+j-1]/10;
 c[i+j-1]%=10;

因为如果i+j的最高位>=10的话,i+j+1位也不能加1,因为i+j+1位在循环里没有遍历到


by _StarBird_ @ 2019-12-05 09:43:09

改成

c[i+j+1]+=c[i+j]/10;
 c[i+j]%=10;

应该就好了qwq


by _StarBird_ @ 2019-12-05 09:43:53

虽然还是建议进位与运算分两个循环

这样保险


by 崭新梦魇之殇 @ 2019-12-05 11:23:17

lz头像好评(明日之后)


by ⚡进击_蒟蒻⚡ @ 2019-12-05 14:09:02

@蒋陈和 谢谢大佬


by _StarBird_ @ 2019-12-05 14:48:39

@⚡进击_蒟蒻⚡ 恩


by 柠檬草苏打水 @ 2020-01-30 14:04:29


#include<iostream>
#include<cstring>
using namespace std;
string a,b;
int x[2005],y[2005];
int z[4000005];
int main()
    cin>>a>>b;
    if((a.length()==1&&a[0]=='0')||(b.length()==1&&b[0]=='0')){
        cout<<0;
        return 0;
    }
    for(int i=a.length()-1,j=1;i>=0;i--)
        x[j++]=a[i]-'0';
    for(int i=b.length()-1,j=1;i>=0;i--)
        y[j++]=b[i]-'0';
    for(int i=1;i<=a.length();i++){
        for(int j=1;j<=b.length();j++){
            z[j+i-1]+=x[i]*y[j];
            int s=j+i-1;
            while(z[s]>=10){
                z[s+1]+=z[s]/10;
                z[s]%=10;
                s++;
            }
        }
    }
    int cnt=4000005;
    while(!z[cnt]){
        cnt--;
    }
    for(int i=z;i;i--) cout<<z[i];
    return 0;
}

|