PAT-A 1081. Rational Sum (20)

来源:互联网 发布:android股票k线图源码 编辑:程序博客网 时间:2024/06/07 16:42

题目链接在此。

典型的分数加法运算。
分数的四则运算相关可以看这里。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct fraction{    long long up, down;}num[105];//求两个数的最大公约数long long gcd(long long a, long long b){    if(b == 0) return a;    else gcd(b,a%b);} //化简一个分数 fraction reduction(fraction f){    //由于题目已经保证负号一定出现在分子,所以下面第一个if可以省略;    //由于在输出的时候判断了分子为0 的情况,所以第二个if可以省略 /*  if(f.down < 0){ //分母为负数         f.up = -f.up; //分子分母取为相反数         f.down = -f.down;     }    if(f.up == 0){ //分子为零         f.down = 1;    }else{ //分母不为零,进行约分         long long d = gcd(abs(f.up), abs(f.down)); //求分数f的分子分母绝对值的最大公约数 ,记得是绝对值         f.up /= d; //分子除以最大公约数         f.down /= d; //分母除以最大公约数    }*/      long long d = gcd(abs(f.up), abs(f.down)); //求分数f的分子分母的最大公约数     f.up /= d; //分子除以最大公约数     f.down /= d; //分母除以最大公约数    return f;  }//分数加法fraction add(fraction a, fraction b){    fraction res;    res.up = a.up*b.down + b.up*a.down;    res.down = a.down*b.down;    return reduction(res);} int main(){    int n;    scanf("%d",&n);    fraction res; //用来保存结果     res.up = 0, res.down = 1; //初始化res    for(int i = 0; i < n; i++){        scanf("%lld/%lld",&num[i].up, &num[i].down);        res = add(res,num[i]);    }    //按要求输出     if(res.up == 0){ //如果分子为0         printf("0\n"); //那么结果为0,直接输出0即可     }else if(res.down == 1){ //如果分母为1         printf("%lld\n",res.up); //直接输出分母即可     }else if(res.up > res.down){ //分子大于分母,此时是一个带分数         printf("%lld ",res.up/res.down); //输出带分数的整数部分        printf("%lld/%lld\n",res.up%res.down, res.down); //带分数的分数部分     } else{ //真分数         printf("%lld/%lld\n",res.up,res.down); //正常输出     }    return 0;}
0 0
原创粉丝点击