1

题目大意:

给定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);
        }
    }
}

提交结果:

image.png

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;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得