看着它就是个大模拟水题,能不能拿满分就看你寄几了
我靠…受小姐姐博客的启发,我也去改了一下gcd函数,把一贯写成的while(b>0)
改成了while(b!=0
就AC了,真就哪个%0的问题呗,emmm,之前连那个直接改成gcd两个参数都为正数输入都没能AC…不知道啥原理,就这样拿了满分呗???玄学问题终于可以告一段落了…
这个20可来的太不容易了…从此gcd函数要换个写法啊,避坑避坑…狗命要紧…都是习惯惹的祸…之前几乎从来没注意到gcd会出错,想当然以为背的板子就是对的…
#include
#include
#include
#include
#include
#include
#include
const int maxn=1005;
using namespace std;
int gcd(long long int a,long long int b)
{
long long int r;
while(b!=0)//这里改一下,不用b>0
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int n;
cin>>n;
if(n==0)
{
printf("0\n");
return 0;
}
long long int s1,m1,s2,m2,ss1;
long long int z=0,t=0;
scanf("%lld/%lld",&s1,&m1);
for(int i=1;i<n;i++)
{
scanf("%lld/%lld",&s2,&m2);
long long int t=m1*m2;
s1*=m2;
s2*=m1;
m1*=m2;
s1=s1+s2;
long long int g=gcd(s1,m1);
s1/=g,m1/=g;
}
long long int g=gcd(s1,m1);//这一部分也是必不可少的
s1/=g,m1/=g;// 1
//2/10
z=s1/m1;
s1=s1%m1;
if(s1>0&&m1<0)//保证负号在分子上
{
s1=-s1;
m1=-m1;
}//这倒是非必要的,因为没出这个测试点
if(z&&s1&&m1)
printf("%d %d/%d\n",z,s1,m1);
else if(!z&&s1&&m1)
printf("%d/%d\n",s1,m1);
else if(s1==0)
cout<<z<<endl;
return 0;
}
垃圾水题,毁我青春,debug了无数次还是过不了测试点3,它到底是个什么神奇测试数据???不过这道题也确实侧面反映出我有很多细节没有考虑,根据广大网友提供的测试数据,还是修改了很多没有考虑到的地方的,比如-号的位置,最后一次的约分(1 2/10),还有一组gcd里出现负号的情况gcd(-1,6)=6,emmm,这里我们只能放正数进去,gcd(1,6)才是正确的…
约分什么的我也做了,就是不知道咋回事吧,因为如果不约分会爆long int来着…long long int爆不爆我没仔细算…大概率是会爆的吧…
据说最后一个测试点是分子为0,不过这里我没有出错,可是为什么没有广大网友告诉我一下 测试点3是什么嘛??? 永恒的17’
此处跪求一个测试点3数据
很多博客说要注意 浮点错误的问题??? 就那啥分母为0你咋办
憨憨不知所措,那该怎么改?测试点3是这个问题么??
#include
#include
#include
#include
#include
#include
#include
const int maxn=1005;
using namespace std;
int gcd(long long int a,long long int b)
{
long long int r;
while(b>0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int n;
cin>>n;
//if(n==0)
//{
// printf("0\n");
// return 0;
//}
long long int s1,m1,s2,m2,ss1;
long long int z=0,t=0;
scanf("%lld/%lld",&s1,&m1);
for(int i=1;i<n;i++)
{
scanf("%lld/%lld",&s2,&m2);
long long int t=m1*m2;
s1*=m2;
s2*=m1;
m1*=m2;
//cout<
s1=s1+s2;
ss1=s1;//2
//-1/2 1/3
if(s1<0)
ss1=-s1;
//cout<<"ss1 "<
long long int g=gcd(ss1,m1);
//cout<<"g "<
s1/=g,m1/=g;
//t=s1/m1;
//s1-=t*m1;
//z+=t;
}
ss1=s1;
if(s1<0)
ss1=-s1;
long long int g=gcd(ss1,m1);
s1/=g,m1/=g;// 1
//2/10
z=s1/m1;
s1=s1%m1;
if(s1>0&&m1<0)//保证负号在分子上
{
s1=-s1;
m1=-m1;
}
if(z&&s1&&m1)
printf("%d %d/%d\n",z,s1,m1);
else if(!z&&s1&&m1)
printf("%d/%d\n",s1,m1);
else if(s1==0)
cout<<z<<endl;
return 0;
}
这博客说她copy了别人的gcd就过了???我没看明白