第一个测试点的输入输出都完全一致,为什么就通不过?

P1303 A*B Problem

Pluto__ @ 2020-02-29 21:40:20

#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main()
{
    int na,nb,m,n,Nh,Nj,Nb=9999;
    char a[10000]={0};
    char b[10000]={0};
    int la[10000]={0};
    int lb[10000]={0};
    int c[10000]={0} ;
    int d[10000]={0} ;
    gets (b);
    gets (a);
    na=strlen(a);
    nb=strlen(b);
    bool o=true;
    if(na>nb)
    {
        o=false;
    }
    if(nb==na)
    {
        for(int i=0; i<na; i++)
        {
            if(b[i]<a[i])
            {
                o=false;
                break;
            }
            if(b[i]>a[i])
            {
                break;
            }
        }
    }
    for(int i=0; i<=na-1; ++i)
    {
        //cout<<"*"<<i<<endl;
        //assert((la-i-1)<la);

        la[na-i-1]=a[i]-48;
    }
    for(int i=0; i<=nb-1; ++i)
    {
        //assert((lb-i-1)<lb); 
        lb[nb-i-1]=b[i]-48;
    }
    //cout <<o;
    for(int i=0; i<na&&o==false; i++)
    {
        n=i;
        for(int r=0; r<nb; r++)
        {
            /*if(n==nb)
            {
                break;
            }
            assert(n<nb);*/
            //m=pow (10,i);
            d[n]=la[i]*lb[r];

            n++;
        }

        for(int j=0; j<n; j++)
        {
            c[j]=d[j]+c[j];
        }
        for(int q=0; q<10000; q++)
        {
            d[q]=0;
        }
        for(int e=9999;e>=0; e--)
        {
            Nh=0;
            if(c[e]/10>0)
            {
                Nh=c[e]/10;
                Nj=c[e]%10;
                c[e]=Nj;
            }
            c[e+1]=c[e+1]+Nh;
        }
    }   
    for(int i=0; i<na&&o==true; i++)
    {
        n=i;

        for(int r=0; r<nb; r++)
        {
            /*if(n==na)
            {
                break;
            }
            assert(n<na);*/
            //m=pow (10,i);
            d[n]=la[i]*lb[r];
            //cout<<d[n]<<endl;
            n++;

        }
        /*for(int q=0; q<3; q++)
        {
            cout<<d[q]<<endl;
        }*/
        for(int j=0; j<n; j++)
        {
            c[j]=d[j]+c[j];
        }
        for(int q=0; q<10000; q++)
        {
            d[q]=0;
        }
        for(int e=9999;e>=0; e--)
        {
            Nh=0;
            if(c[e]/10>0)
            {
                Nh=c[e]/10;
                Nj=c[e]%10;
                c[e]=Nj;
            }
            c[e+1]=c[e+1]+Nh;
        }
    }
    for(int i=9999; i>=0; i--)
    {
        if(c[i]==0)
        {
            Nb--;   
        }
        else
        {
            break;
        }
    }

    for(int i=Nb; i>=0; i--)
    {
        cout<<c[i];
    }
    if(Nb<0)
    {
        cout<<"0";
    }
}

而且更有趣的是:如果我把上面代码中的输出部分注释掉,然后直接写

cout<<"0";

第一个测试点是可以通过的 在dev c++里面,我针对我贴出的上述代码,实际对于第一个测试点的输入数据运行时,最后执行的输出部分代码是

if(Nb<0)
{
    cout<<"0";
}

这样就通不过?不是都执行的是

cout<<"0";

吗? 这是什么问题啊?


by HearTheWindSing @ 2020-02-29 21:56:54

@gzb0702 建议上网正儿八经地学一学高精度


by Pluto__ @ 2020-02-29 23:07:22

我并没有说我的代码没有问题,但上面的回复并没有正面解答我的问题,我并不认为这样的回答有任何帮助。 如果上面的回答者的语文不是体育老师教的话,应该能看明白我的问题并不是关于高精度乘法应该怎么做的,而是质疑判定规则有问题,同样的输入输出为什么就不能通过?难道自动判定的程序能智能到检查出程序逻辑是否有问题?或者说程序逻辑必须是某种特定的逻辑?其他不是这种特定的逻辑就必然是错误的逻辑?


by Pluto__ @ 2020-03-01 22:36:29

#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main()
{
    int na,nb,m,n,Nh,Nj,Nb=9999;
    char a[10000]={0};
    char b[10000]={0};
    int la[10000]={0};
    int lb[10000]={0};
    int c[10000]={0} ;
    int d[10000]={0} ;
    gets (b);
    gets (a);
    na=strlen(a);
    nb=strlen(b);

    for(int i=0; i<=na-1; ++i)
    {   
        la[na-i-1]=a[i]-48;
    }
    for(int i=0; i<=nb-1; ++i)
    { 
        lb[nb-i-1]=b[i]-48;
    }

    for(int i=0; i < nb; i++)
    {
        n=i;
        for(int r=0; r<na; r++)
        {
            d[n]=la[r]*lb[i];
            n++;
        }

        for(int j=0; j<n; j++)
        {
            c[j]=d[j]+c[j];
        }
        for(int q=0; q<10000; q++)
        {
            d[q]=0;
        }
        for(int e=0;e<n; e++)
        {
            Nh=0;
            if(c[e]/10>0)
            { 
                Nh=c[e]/10;
                Nj=c[e]%10;
                c[e]=Nj;
            }
            c[e+1]=c[e+1]+Nh;
        }
    }   

    for(int i=9999; i>=0; i--)
    {
        if(c[i]==0)
        {
            Nb--;   
        }
        else
        {
            break;
        }
    }

    for(int i=Nb; i>=0; i--)
    {
        cout<<c[i];
    }
    if(Nb<0)
    {
        cout<<"0";
    }
}

贴下最新的代码,依然是在输入输入和测试点数据一致的情况下通不过,我的代码有什么问题?


by Pluto__ @ 2020-03-01 22:37:10

或者不是我代码的问题?


by _tommysun_ @ 2020-03-03 22:07:41

@gzb0702 第一题的输入输出我看过了(浪费了我的下载机会qwq),还需要在代码一开始的地方加个特判0


by _tommysun_ @ 2020-03-03 22:10:53

@gzb0702 我修改了一下,代码如下

#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main()
{
    int na,nb,m,n,Nh,Nj,Nb=9999;
    char a[10000]={0};
    char b[10000]={0};
    int la[10000]={0};
    int lb[10000]={0};
    int c[10000]={0} ;
    int d[10000]={0} ;
    gets (b);
    gets (a);
     if(a=="0"||b=="0"){
      cout<<"0";
     return 0;
   }
    na=strlen(a);
    nb=strlen(b);

    for(int i=0; i<=na-1; ++i)
    {   
        la[na-i-1]=a[i]-48;
    }
    for(int i=0; i<=nb-1; ++i)
    { 
        lb[nb-i-1]=b[i]-48;
    }

    for(int i=0; i < nb; i++)
    {
        n=i;
        for(int r=0; r<na; r++)
        {
            d[n]=la[r]*lb[i];
            n++;
        }

        for(int j=0; j<n; j++)
        {
            c[j]=d[j]+c[j];
        }
        for(int q=0; q<10000; q++)
        {
            d[q]=0;
        }
        for(int e=0;e<n; e++)
        {
            Nh=0;
            if(c[e]/10>0)
            { 
                Nh=c[e]/10;
                Nj=c[e]%10;
                c[e]=Nj;
            }
            c[e+1]=c[e+1]+Nh;
        }
    }   

    for(int i=9999; i>=0; i--)
    {
        if(c[i]==0)
        {
            Nb--;   
        }
        else
        {
            break;
        }
    }

    for(int i=Nb; i>=0; i--)
    {
        cout<<c[i];
    }
}

(那个判断语句可能写错了,一直都是用string的,谅解一下。反正就是判断输入的数是不是0,如果这样还不能过那么就是你高精本身的问题了


by WanderingTrader @ 2020-03-29 17:08:46

你是C++,不是C,用string 不是更简单吗


by Query_Failed @ 2020-08-20 19:54:40

考古


|