P8584 探索未知 题解
OoXiao_QioO
·
·
题解
思路
这道题考验你三年级所学的分数加减法。
我们都知道 \dfrac{a}{x}+\dfrac{b}{y} = \dfrac{ay+bx}{xy},而 \dfrac{a}{x}-\dfrac{b}{y} = \dfrac{ay-bx}{xy}(不考虑负数),把上述式子结合一下就可以得出正数情况下的加减法,对于负数的情况,只需要把分母的符号提到分子前即可。
多个分数加减法呢?
比如 \dfrac{a}{x}+\dfrac{b}{y}+\dfrac{c}{z},答案就等于
数学方面的分数加减法会算了,转换成变成语言该是什么呢?我们可以把每次输入的分子分母及 $opt_i$ 扔进数组里存储起来,求出所有分母的最小公倍数为最后答案的分母,而枚举分子时,带入上述的式子,即 `fz += (a[i]*(fm/b[i]));`,最后处理一下负数的细节即可。
# 代码
```cpp
ll a[1001],b[1001],op[1001],lc,fz,fm;//开 ll 比较保险。
signed main()
{
ll n,i;
cin>>n;
cin>>a[1]>>b[1]>>op[1];//输入第一个数的分子分母即符号。
lc = b[1];
for(i=2;i<=n;i++)
{
cin>>a[i]>>b[i]>>op[i];
lc = lcm(lc,b[i]);//求出所有分母的最小公倍数,即答案的分母。
}
fm = lc;
fz = 0;
for(i=1;i<=n;i++)
{
if(op[i]==1)//如果这个分数的符号为正
fz += (a[i]*(fm/b[i]));//分子加上通分后的分子。
else
fz -= (a[i]*(fm/b[i]));//否则减去通分后的分子。
}
if(fz%fm==0)//判断分数值是否为整数。
printf("%lld\n",fz/fm);
else
{
//接下来处理分母为负数的情况。
ll tfz = fz/gcd(fz,fm);
ll tfm = fm/gcd(fz,fm);
if(tfz>0&&tfm<0)//什么为负数情况呢?分子分母异号且分母是负数,此时分子分母互相取反即可。
tfz = -tfz,tfm = -tfm;
printf("%lld/%lld\n",tfz,tfm);
}
return 0;
}
}}}}}
}
```