L1-009 N个数求和 (20 分)——易错样例分析

题目链接

题解

这道题,按照两两分数相加模拟就行
不过需要注意

  • 数据为长整型,要爆int,可以使用long long,否则会wa样例3
    在这里插入图片描述
  • 注意所有数字相加为0的情况,直接输出0,否则wa样例5
  • 注意处理负号,分数部分的负号应该在分子前面
  • 注意只有当整数和分数部分都存在时才输出空格,否则可能格式错误
  • 我的代码是分子为b,分母为a

AC代码

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define ll long long
#define ull unsigned long long
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#define gcd(a,b) __gcd(a,b)
#define ft first
#define sd second
#define endl '\n'
#define PI acos(-1.0)
#define lcm(a,b) a/gcd(a,b)*b
#define INF_INT 0x3f3f3f3f
#define INF_LONG 4557430888798830399
#define N 100009
//inline void print(__int128 x){if(x<0) {putchar('-'); x=-x;}if(x>9) print(x/10);putchar(x%10+'0');}
//inline int read(){int s=0,x=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') x=-1; ch=getchar();}	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar(); }return s*x;}
struct node
{
	ll b,a;
}p[N]; 
int main()
{
	int n;
	cin>>n;
	for(int i=0; i<n; i++)	scanf("%lld/%lld",&p[i].b,&p[i].a);
	for(int i=0; i<n-1; i++)
	{
		ll b1=p[i].b,a1=p[i].a;
		ll b2=p[i+1].b,a2=p[i+1].a;
		ll a3=lcm(a1,a2);
		ll d1=a3/a1,d2=a3/a2;
		ll b3=(ll)b1*d1+(ll)b2*d2;
		p[i+1].a=a3,p[i+1].b=b3;
	}
	//要注意2 2/3 -2/3 这样的样例,答案为0 
	ll a=p[n-1].a,b=p[n-1].b;
	ll flag=1;
	if(p[n-1].b==0) 
	{
		cout<<0<<endl;
		return 0;
	}
  	if(b<0) flag=0;
    a=abs(a),b=abs(b);
    ll  g=gcd(a,b);
    a/=g,b/=g;//约分 
    ll x=b/a;
	b=b-x*a; 
	if(x) 
	{
		if(!flag) cout<<"-";
		cout<<x;
	}
	if(a!=1) 
	{
		if(x) cout<<" ";
		if(!flag) cout<<"-";
		printf("%lld/%lld\n",b,a);
	} 
	return 0;
 } 



posted @ 2022-08-28 08:43  翔村亲亲鸟  阅读(31)  评论(0编辑  收藏  举报