题目大意:
给定N个分数,求出这N个分数的和。若为假分数,得按照带分数的方式进行输出,整数按照整数的形式输出,否则按照真分数进行输出。
算法思路:
直接模拟数学上的分数相加,过程如下:
1.分数采用Fraction结构体存储,这里要求数据得是long long型
2.gcd函数求解两数的最大公约数,目的是为了后面的化简操作,相应代码如下:
long long gcd(long long a,long long b){
if(b==0) return a;
else return gcd(b,a%b);
}
3.分数的化简:满足2个原则
1)如果分母为负数,令分子和分母都变为相反数,保证负号在分子上。
2)约分:求出分子绝对值和分母的最大公约数d,然后让分子和分母同时除以d
代码如下:
Fraction reduction(Fraction f){
if(f.denominator<0) {
// 分母为负数,将分母和分子都取反
f.numerator = -f.numerator;
f.denominator = -f.denominator;
}
// 获得分子分母的最大公约数
long long d = gcd(abs(f.numerator),f.denominator);
// 约分
f.denominator /= d;
f.numerator /= d;
return f;
}
4.add计算两个分数的加法,按照数学公式来就行,最后返回化简的结果
5.分数的输出规则:
1)如果分母为1,说明该分数为整数,输出分子即可
2)如果分子的绝对值大于分母,说明是假分数,此时按照带分数的格式输出,即先输出 整数部分(分子除以分母),分子(分子绝对值对分母求余数)/分母
3)否则就是真分数,按照原样输出即可
代码如下:
void print(Fraction f){
if(f.denominator==1){
// 整数,输出分子即可
printf("%lld",f.numerator);
} else {
if(abs(f.numerator)>f.denominator){
// 假分数
printf("%lld %lld/%lld",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
} else {
// 真分数
printf("%lld/%lld",f.numerator,f.denominator);
}
}
}
提交结果:
AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
struct Fraction{
long long numerator;// 分子
long long denominator;// 分母
// 默认分数为0
Fraction(){
numerator = 0;
denominator = 1;
}
};
// 求a和b的最大公约数
long long gcd(long long a,long long b){
if(b==0) return a;
else return gcd(b,a%b);
}
// 分数的化简
Fraction reduction(Fraction f){
if(f.denominator<0) {
// 分母为负数,将分母和分子都取反
f.numerator = -f.numerator;
f.denominator = -f.denominator;
}
// 获得分子分母的最大公约数
long long d = gcd(abs(f.numerator),f.denominator);
// 约分
f.denominator /= d;
f.numerator /= d;
return f;
}
// 分数a和分数b的加法
Fraction add(Fraction a,Fraction b){
Fraction r;
r.denominator = a.denominator*b.denominator;
r.numerator = a.denominator*b.numerator+a.numerator*b.denominator;
return reduction(r);// 返回化简的结果
}
// 分数的输出
void print(Fraction f){
if(f.denominator==1){
// 整数,输出分子即可
printf("%lld",f.numerator);
} else {
if(abs(f.numerator)>f.denominator){
// 假分数
printf("%lld %lld/%lld",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
} else {
// 真分数
printf("%lld/%lld",f.numerator,f.denominator);
}
}
}
int main(){
int N;
scanf("%d",&N);
Fraction r,in;
// 初始化r为0
for (int i = 0; i < N; ++i) {
scanf("%lld/%lld",&in.numerator,&in.denominator);
r = add(r,in);
}
print(r);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。