您的位置:首页 > 其它

1081. Rational Sum (20)解题报告

2016-11-26 19:02 357 查看
不要使用abs函数,因为它的形参是int类型。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cmath>

struct RationalNum {
long long numerator, denominator;
};

RationalNum add(RationalNum n1, RationalNum n2);
long long gcd(long long n1, long long n2);
void printsum(RationalNum n);

int main(void) {
RationalNum *arr, sum;
int n, i;
scanf("%d", &n);
arr = new RationalNum
;
for (i = 0; i < n; i++) {
scanf("%lld/%lld", &arr[i].numerator, &arr[i].denominator);
}
sum = arr[0];
for (i = 1; i < n; i++) {
sum = add(sum, arr[i]);
}
printsum(sum);
delete[] arr;
return 0;
}

RationalNum add(RationalNum n1, RationalNum n2) {
RationalNum sum;
long long factor1, factor2, factor3;
factor1 = gcd(n1.denominator, n2.denominator);
factor2 = n1.denominator / factor1;
factor3 = n2.denominator / factor1;
sum.denominator = factor1 * factor2 * factor3;
n1.numerator *= factor3;
n2.numerator *= factor2;
sum.numerator = n1.numerator + n2.numerator;
factor1 = gcd(sum.numerator, sum.denominator);
sum.numerator /= factor1;
sum.denominator /= factor1;
if (!sum.numerator) {
sum.numerator = 0;
sum.denominator = 1;
}
return sum;
}

long long gcd(long long n1, long long n2) {
long long n3;
if (n1 && n2) {
if (n1 < 0) {
n1 = -n1;
}
if (n2 < 0) {
n2 = -n2;
}
while (n1 % n2) {
n3 = n1 % n2;
n1 = n2;
n2 = n3;
}
return n2;
}
else {
return 1;
}
}

void printsum(RationalNum n) {
long long integer, numerator, denominator, factor, character;
factor = gcd(n.numerator, n.denominator);
denominator = n.denominator / factor;
numerator = n.numerator / factor;
if (numerator >= 0) {
character = 1;
}
else {
character = -1;
numerator = -numerator;
}
integer = numerator / denominator;
numerator %= denominator;
if (integer) {
integer *= character;
if (numerator) {
printf("%lld %lld/%lld\n", integer, numerator, denominator);
}
else {
printf("%lld\n", integer);
}
}
else {
numerator *= character;
if (numerator) {
printf("%lld/%lld\n", numerator, denominator);
}
else {
printf("%lld\n", 0);
}
}
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: