L1-009 N个数求和

L1-009 N个数求和

看着它就是个大模拟水题,能不能拿满分就看你寄几了

满分版本

我靠…受小姐姐博客的启发,我也去改了一下gcd函数,把一贯写成的while(b>0)改成了while(b!=0就AC了,真就哪个%0的问题呗,emmm,之前连那个直接改成gcd两个参数都为正数输入都没能AC…不知道啥原理,就这样拿了满分呗???玄学问题终于可以告一段落了…

这个20可来的太不容易了…从此gcd函数要换个写法啊,避坑避坑…狗命要紧…都是习惯惹的祸…之前几乎从来没注意到gcd会出错,想当然以为背的板子就是对的…

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
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;
}

未AC版:

垃圾水题,毁我青春,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 <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
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<<" "<<m1<<" "<<s2<<" "<<m2<<endl;
		s1=s1+s2;
		
		ss1=s1;//2
			   //-1/2 1/3
		if(s1<0)
		ss1=-s1;
		//cout<<"ss1 "<<ss1<<endl;
		
		long long int g=gcd(ss1,m1);
		//cout<<"g  "<<g<<endl;
		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就过了???我没看明白

这个博客的总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值