5-35 有理数均值 (20分)

题目:

输入格式:

输入第一行给出正整数N(\le≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:

在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:

4
1/2 1/6 3/6 -5/10
输出样例1:

1/6
输入样例2:

2
4/3 2/3
输出样例2:

1

思路:分数相加,化简,会用到最大公约数,跟最小公倍数,先写两个函数实现,将读入的分数做累加就好了,为了防止溢出累加之后化简一下。

C语言实现:

#include <stdio.h>
void add(int *a, int *b, int c, int d);
int gcd(int n, int m);
int lcm(int n, int m);
int main(void)
{
    int n;
    int a, b, sum_a = 0, sum_b = 1;
    scanf("%d", &n);
    int i;
    int x, y;
    for (i=0; i<n; i++){
        scanf("%d/%d", &a, &b);
        add(&sum_a, &sum_b, a, b);  
        y = gcd(sum_a, sum_b);
        sum_a /= y;
        sum_b /= y;
    }
    sum_b *= n;
    y = gcd(sum_a, sum_b);
    sum_a /= y;
    sum_b /= y; 
    
    if (sum_b == 1){
        printf("%d", sum_a);
    } else {
        printf("%d/%d", sum_a, sum_b);
    }
    
    return 0;
    
}

int gcd(int n, int m)
{
    int r;
    while (n%m != 0){
        r = n % m;
        n = m;
        m = r;
    }
    return m;
}

int lcm(int n, int m)
{
    return n * m / gcd(n, m);
}

void add(int *a, int *b, int c, int d)
{
    int l, n;
    n = lcm(*b, d);
    *a *= n / *b;
    c *= n / d;
    *b = d = n;
    
    *a = *a + c;
}

通过了全部测试。

QQ截图20170724201455.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到Github Pages浏览最新内容。...
    OliverLew阅读 6,702评论 3 1
  • 传送门 https://pintia.cn/problem-sets/994805260223102976/pro...
    Rush的博客阅读 9,173评论 0 1
  • 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,...
    bbqub阅读 3,362评论 0 0
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 7,678评论 0 5
  • 不是自己体验,实在很难想象有灯光和没有灯光的差别(ฅ>ω<*ฅ) 没灯的时候是这样的 有灯了以后是这样哒 这分明就...
    恋家梦游猫阅读 1,490评论 0 0

友情链接更多精彩内容