P8584 探索未知 题解

· · 题解

思路

这道题考验你三年级所学的分数加减法。

我们都知道 \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; } }}}}} } ```