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
考古