PAT A1081 Rational Sum

PAT A1081 Rational Sum

在这里插入图片描述

Sample Input 1:

5
2/5 4/15 1/30 -2/60 8/3

Sample Output 1:

3 1/3

Sample Input 2:

2
4/3 2/3

Sample Output 2:

2

Sample Input 3:

3
1/3 -1/6 1/8

Sample Output 3:

7/24
wordmeaning
numeratorn. 分子
denominatorn. [数] 分母
fractional[数] 分数的
  • 思路 1:
    模拟分数加法,约分,以及规格化输出

  • code 1:

#include <stdio.h>
#include <cmath>
#include <iostream>
#define ll long long 
using namespace std;
struct Frac{
	ll up, down;
}frac[110];
ll gcd(ll a, ll b){
	return b == 0 ? a : gcd(b, a%b);
}
Frac simp(Frac a){
	int up = a.up;
	if(a.up < 0) up = -a.up;
	if(a.up == 0) a.down = 1;	//!!!Wrong 1: 
	else{
		ll d = gcd(up, a.down);
		a.up /= d;
		a.down /= d;
	}
	return a;
}
Frac mul(Frac a, Frac b){
	Frac res;
	simp(a); simp(b);
	res.down = a.down * b.down;
	res.up = a.up * b.down + b.up * a.down;
	res = simp(res);
	return res;
}
void output(Frac a){
	simp(a);
	if(a.down == 1) printf("%lld", a.up);	//整数
	else if(abs(a.up) > a.down)		//假分数 
		printf("%lld %lld/%lld", abs(a.up)/a.down, a.up%a.down, a.down); 
	else printf("%lld/%lld", a.up, a.down);	//分数 
}
int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; ++i){
		scanf("%lld/%lld", &frac[i].up, &frac[i].down);
	}
	
	Frac ans; ans.up = 0; ans.down = 1;
	for(int i = 0; i < n; ++i){
		ans = mul(ans, frac[i]);
	}
	output(simp(ans));
	return 0;
}
  • T2 code:
#include <bits/stdc++.h>
using namespace std;

struct Frac{
	int up, down;
	Frac(){
		up = 0;
		down = 1;
	}
};

int gcd(int a, int b){
	return b ?  gcd(b, a % b) : a; 
}

Frac Reduction(Frac r){
	if(r.down < 0){
		r.down = -r.down;
		r.up = -r.up;
	}
	if(r.up == 0){
		r.down = 1;
	}else{
		int d = gcd(abs(r.up), r.down);
		r.up /= d;
		r.down /= d; 
	}
	return r;
}
Frac Add(Frac a, Frac b){
	a.up = a.up * b.down + b.up * a.down;
	a.down = a.down * b.down;
	return a;
}
void Print(Frac r){
	r = Reduction(r);
	if(r.down == 1){	//整数 
		printf("%d", r.up);
	}else if(r.up > r.down){
		printf("%d %d/%d", r.up / r.down , abs(r.up) % r.down, r.down);
	}else{
		printf("%d/%d", r.up, r.down);
	}
}

int main(){
	int n;
	scanf("%d", &n);
	Frac ans;
	for(int i = 0; i < n; ++i){
		Frac tmp;
		scanf("%d/%d", &tmp.up, &tmp.down);
		ans = Add(ans, tmp);
	}
	Print(ans);
	return 0;
}
  • T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
struct Frac
{
    int up, down;
}frac[maxn];
int Gcd(int a, int b)
{
    return (b == 0 ? a : Gcd(b, a % b));
}
Frac Reduce(Frac f)
{
    if(f.up < 0)
    {
        f.up = -f.up;
        f.down = -f.down;
    }
    if(f.up == 0)
    {
        f.down = 1;
    }else
    {
        int d = Gcd(f.up, abs(f.down));
        f.up /= d;
        f.down /= d;
    }
    return f;
}
void ADD(Frac & ans, Frac fb)
{
    ans.up = ans.up * fb.down + fb.up * ans.down;
    ans.down = ans.down * fb.down;
    ans = Reduce(ans);
}
void ShowFrac(Frac ans)
{
    if(abs(ans.down) == 1)
    {
        printf("%d", ans.down < 0 ? -1 * ans.up : ans.up);
    }else if(ans.up > abs(ans.down))
    {
        printf("%d %d/%d", ans.up / abs(ans.down), ans.up % abs(ans.down), ans.down);
    }else
    {
        printf("%d/%d", ans.up, ans.down);
    }
}
int main()
{
    Frac ans; ans.up = 0; ans.down = 1;
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
    {
        Frac tmp;
        scanf("%d/%d", &tmp.up, &tmp.down);
        ADD(ans, tmp);
    }
    ShowFrac(ans);
    return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值