洛古P1572题解

字符串大模拟纯暴力写法QAQ
废话不多说

思路:

①既然要把这些分数加起来就要判断好分母分子。

在这里我们把所有数存入一个专门的数组,输入格式已经确定,那就是

数字—‘/’—数字—‘+或-’。

我们把所有相连的数字看为一个编号,‘+或-’所对应的编号一定是3+4*n(n>=0)(从0开始编号)计算是只需计算‘+或-’前面两个数字串和后面两个数字串所组成的分数即可。

②分数计算要通分。

我采用的计算方法是 (分子1×分母2+分子2×分母1)/(分母1×分母2),也是最直接的计算方法,最后分子分母在同时除以公因数即可。

③判负很关键。

因为两个分数计算后不一定是正的,所以要判断好负号出现的情况。

④整数输出。

如果一个分数的分母==1,那么直接输出分子就好了。(在分数化简完全的情况下)

附AC代码:

#include<bits/stdc++.h>
using namespace std;
char a[101];
int b[101],num,num1;
int gcd(int x,int y)
{
	return y==0?x:gcd(y,x%y);
}// 求最大公因数。
int ans=1;
int main()
{
	cin>>a;
	int lena=strlen(a);
	for(int i=0;i<lena;i++)
	{
		if(a[i]>='0'&&a[i]<='9')
		{
			b[num]=b[num]*10+a[i]-'0';
		}
		else num++;
	}// 把数字全都剥离开来,存放入一个新的数组中。
	for(int i=0;i<lena;i++)
	{
		if(a[i]=='+')
		{
			int p=2*num1;// ‘+’号和‘-’号一定出现在每四个数字的中间位置。
			num1++;
			b[p+2]=b[p]*b[p+3]*ans+b[p+2]*b[p+1];
			b[p+3]*=b[p+1];
            	// (分子1*分母2+分子2*分母1)/(分母1*分母2),计算方法。 
			if(b[p+2]<0) ans=-1,b[p+2]*=-1;
			else ans=1;// 判负条件。
			int k=gcd(b[p+3],b[p+2]);
			while(k!=1)
			{
				b[p+3]/=k;b[p+2]/=k;
				k=gcd(b[p+3],b[p+2]);
			}
			
		}
		if(a[i]=='-')
		{
			int p=2*num1;
			num1++;
			b[p+2]=b[p]*b[p+3]*ans-b[p+2]*b[p+1];
			b[p+3]*=b[p+1];
			if(b[p+2]<0) ans=-1,b[p+2]*=-1;
			else ans=1;
			int k=gcd(b[p+3],b[p+2]);
			while(k!=1)
			{
				b[p+3]/=k;b[p+2]/=k;
				k=gcd(b[p+3],b[p+2]);
			}
		}
	}
	if(ans==-1) cout<<'-';// 如果最终结果是负的,要先输出一个‘-’号。
	int k=gcd(b[2*num1],b[2*num1+1]);
	b[2*num1]/=k;b[2*num1+1]/=k;
	cout<<b[2*num1];
	if(b[2*num1+1]!=1) cout<<'/'<<b[2*num1+1];// 判断是否为整数输出。
	return 0;
}// AC!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值