题目:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数
输出上述数字和的最简形式 —— 即将结果写成
整数部分 分数部分,
其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。
如果结果的整数部分为0,则只输出分数部分。
思路
**(一)**看到这道题目,第一反应想的是直接输入一个分数“a/b”,但是这样的话得到的是一个整数,所以又想把它*0.1转化为double,但是这样相加之后也只能保留部分小数,并不精确
因此此时需采用“将分子分母分开输入,用"/"代替除号
(二) 接下来进行相邻两项的求和,此时需要给一个初始化分子y为0,分母x任意的第一项,才可以与后一项输入的分子a与分母b进行求和,得到新的分子y 与分母x
(三) 求出前后两项b的最小公倍数 并将两个a 相加 加完后就进行约分化简 得到一个最简分数 然后循环,最后控制输出格式。
实践
First.
定义 and 输入
typedef long long ll;
cin >> N;
char ch;
int j,k;
for(i=1;i<=N;i++)
{
cin >> a;
cin >> ch; //以字符"/"代替除号
cin >> b;
c=gongbei(x,b);
Second.
在得到最小公倍数之后,如何算出相应的新分子并进行相加???
此时应用数学来解决!!
d=c/b;
e=c/x;
y=a*d+y*e; //y就是新的分子之和
x=c; //将分母x更新为c (此时的最小公倍数
Third.
接着来到化简步骤
先找到分子y与分母x的最大公约数
//化简需要找最大公约数``
ll gongyue(ll x,ll y)
{
whiile(x%y != 0)
{
x = y;
y = x%y;
}
return y;
}
得到两项的一个和之后,需要及时将结果进行化简,
否则会导致分母越来越大
void huajian(ll &x,ll &y) //分母,分子。
//因为化简完的x与y需传给实参,所以要加引用符号
{
ll a;
a=gongyue(x,y);
x=x/a;
y=y/a;
}
Last.
控制输出格式
if((y>x)||((y<x)&&(fabs(y)>x)))
{
j = y/x;
k = y-j*x;
if(k!=0)
cout << j << " " << k << "/" << x;
else cout<<j;
}
else cout << y << "/" << x;