PAT甲级 1081(C++)

看了好几篇博客,终于AC了

参考:1081. Rational Sum (20)-PAT甲级真题 – 柳婼 の blog

浙大 PAT 甲级 1081 Rational Sum 分数运算 排错清单 错误原因_马铃薯小弟的博客-CSDN博客pat-1081 Rational Sum(20)(分数运算之注意细节系列)_欢迎访问方偲的博客-CSDN博客

总结一下个人遇到的错误:

1、一开始没将输入数据设置为long long型

2、没有特殊处理整数部分为0,分子部分也为0的情况

3、测试点3错误,在每一次读取完分子分母就进行约分,修改后结果正确(防止最后求和时分子溢出)

AC代码:

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int gcd(long long x, long long y) {
	if (x < y) swap(x, y);
	if (x % y == 0) return y;
	else return gcd(y, x % y);
}
vector<long long>numer;
vector<long long>denom;
int main() {
	int N; cin >> N;
	numer.resize(N); denom.resize(N);
	long long g = 1;
	for (int i = 0; i <N; i++) {
		scanf("%lld/%lld", &numer[i], &denom[i]);
		g = gcd(abs(numer[i]), abs(denom[i]));
		numer[i] /= g; denom[i] /= g;
	}
	 long long mul = 1;
	for (int i = 0; i < N; i++) {
	    g = gcd(mul, denom[i]);
		mul =mul*denom[i]/g;
	}
	long long up = 0;
	for (int i = 0; i < N; i++) {
		up += numer[i] * (mul/denom[i]);
	}
	long long int_part = up / mul;
	up -=int_part * mul;
	int flag = 1;
	if (int_part != 0) cout << int_part;
	else flag = 0;
	if (up != 0) {
		if (flag == 1) cout << " ";
		long long div = gcd(mul, abs(up));
		mul /= div; up /= div;
		printf("%lld/%lld", up, mul);
	}
	if (int_part == 0 && up == 0) cout << 0;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45681165/article/details/121165850