![](https://img-blog.csdnimg.cn/img_convert/d4cbb97920f5cc901bc3890984c31cb9.png)
![](https://img-blog.csdnimg.cn/img_convert/752212b71f5fb360e36d67637ebeaed1.png)
这是这一题的题目,解决它需要学会如何求最大公约数来对分子分母进行约分,同时对输出有一定的要求,我采用结构体的方式来存储分数,创建长度为n+1的数组,并用下标为n的空间存储累加的和,大概解决了以下几个问题:
用scanf()解决了输入带'/'的问题,但应该还有其他方法可以达成此目的
用abs()解决了当最后的和为负数时的计算
用while循环解决了约分的问题,但时间复杂度可能较高,应该还有改进的空间
用一个bool型变量flag解决了输出对空格的要求
用了三个if语句来满足各种情况的输出,应该还有改进的空间
以下是我的代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef struct
{
int fenzi;
int fenmu;
}Fs;
int main()
{
int n;
cin >> n;
Fs fs[n+1];
fs[n].fenzi = 0;
fs[n].fenmu = 1;
for(int i = 0; i < n; i++)
{
scanf("%d/%d", &fs[i].fenzi, &fs[i].fenmu);
fs[n].fenzi = fs[n].fenzi*fs[i].fenmu + fs[i].fenzi*fs[n].fenmu;
fs[n].fenmu = fs[n].fenmu*fs[i].fenmu;
int j = 2;
while(j <= abs(fs[n].fenzi) && j <= abs(fs[n].fenmu))
{
if(fs[n].fenzi%j==0 && fs[n].fenmu%j==0)
{
fs[n].fenzi /= j;
fs[n].fenmu /= j;
continue;
}
else
j++;
}
}
bool flag = false;
if(abs(fs[n].fenzi) >= abs(fs[n].fenmu))
{
cout << fs[n].fenzi/fs[n].fenmu;
fs[n].fenzi %= fs[n].fenmu;
flag = true;
}
if(fs[n].fenzi != 0)
{
if(flag)
cout << " ";
printf("%d/%d", fs[n].fenzi, fs[n].fenmu);
}
if(flag == false && fs[n].fenzi == 0)
cout << "0";
return 0;
}
欢迎大家探讨和指点