1081.Rational Sum (20)

本文提供了一种解决PAT AL-1081 RationalSum问题的方法,通过将分数相加并简化得到最终结果。文章详细介绍了如何处理输入数据、计算分数和、寻找最大公约数进行分数化简的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1081.Rational Sum (20)

pat-al-1081

2017-01-27

  • 坑见注释
  • 方法:把输入一个一个加起来。化简需要求最大公约数,使用gcd
/**
 * pat-al-1081
 * 2017-01-27
 * C version
 * Author: fengLian_s
 */
#include<stdio.h>
int gcd(long a, long b)
{
  return b == 0 ? a : gcd(b, a%b);
}
int main()
{
  freopen("in.txt", "r", stdin);
  int n;
  scanf("%d", &n);
  long input[2], sum[2] = {0, 1};
  for(int i = 0;i < n;i++)
  {
    scanf("%ld/%ld", &input[0], &input[1]);//0位是分子,1位是分母
    if(input[0] == 0)//坑:要对输入的0特殊处理一下,有个测试点包括这个
      continue;
    sum[0] = sum[0] * input[1] + input[0] * sum[1];//新的分母
    sum[1] = sum[1] * input[1];
    long d = gcd(sum[0], sum[1]);//化为最简
    if(d < 0)//坑:对求出的d需要处理
      d = -d;
    sum[0] /= d;
    sum[1] /= d;
  }
  if(sum[0] < 0)
  {
    putchar('-');
    sum[0] = -sum[0];
  }
  if(sum[1] == 1)//分母为1就不要输出分母了
    printf("%ld\n", sum[0]);
  else if(sum[0] > sum[1])
    printf("%ld %ld/%ld\n", sum[0]/sum[1], sum[0]%sum[1], sum[1]);
  else
    printf("%ld/%ld\n", sum[0], sum[1]);
}

-FIN-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值