1081 Rational Sum (20 point(s)) 笔记

A级81题笔记

原题链接
比较简单的一道题,分数的加减法运算。下面给出我自己的accept代码。

#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int gcd(long int a, long int b) {
	if (b == 0)
		return a;
	else
		return gcd(b, a%b);
}
class FractionNumber {
public:
	long long up, down;
	FractionNumber() {
		up = 0, down = 1;
	}
};
FractionNumber reduction(FractionNumber result) {
	if (result.down < 0) {
		result.up = -result.up;
		result.down = -result.down;
	}
	if (result.up == 0)
		result.down = 1;
	else {
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}
FractionNumber add(FractionNumber a, FractionNumber b) {
	FractionNumber result;
	result.up = a.up*b.down + b.up*a.down;
	result.down = a.down*b.down;
	return reduction(result);
}

void showResult(FractionNumber r) {
	r = reduction(r); 
	if (r.down == 1)
		cout << r.up << endl;
	else if (abs(r.up) > r.down)
		printf("%lld %lld/%lld\n", r.up / r.down, abs(r.up) % r.down, r.down);
	else
		cout << r.up << "/" << r.down << endl;
}
int main() {
	FractionNumber result;
	FractionNumber temp;
	int number = 0;
	cin >> number;
	for (int i = 0; i < number ; i++) {
		scanf("%lld/%lld", &temp.up, &temp.down);
		result = add(result, temp);
	}
	showResult(result);
	return 0;
}

注意点:

  1. 可能又是只有我一个人犯这样的错误……数据定义成什么类型,就最好用什么类型进行接受存储。例如:定义a为long long类型的数据,就记得是要用%lld进行scanf或者printf,别偷懒用%ld。在这段代码中要是没有准确使用会导致出现一堆奇怪的数字。
  2. 由于分数运算涉及乘法,对于数据类型的定义应该使用long long类。题目中所给的范围是在long int内,相乘的话是会需要long long类型的。
  3. 分数约分的实现方法:
    • 当检测到分母为负时,统一转化为分子为负的情况。
    • 当分子为0时,统一将分母定义为1。
    • 求出分子分母取绝对值时的最大公约数,再同时除以公约数进行约分。

Roman wasn’t built in a day.Just do it.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值