题目
给出一些分数,求他们的和,要求真分数直接输出,假分数化作带分数这种形式,可完全约分的就直接输出结果
代码和思路
- 计算机不会肉眼看出来通分结果,所以直接按照默认分母没有最大公倍数进行计算
- 每加和一次都要进行一次最简的约分,因为100分数分母连乘是一定会溢出的
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
long tempnum = 0;
long tempden = 0;
long numerator = 0;
long denominator = 0;
bool flagin;
bool flagfinal = true;
void exchange(string str) {
tempnum = 0;
tempden = 0;
flagin = true;
bool flagnum = true;
int i = 0;
if (str[0] == '-') { flagin = false; i++; }
for (; i < str.length(); i++) {
if (str[i] == '/') {
flagnum = false;
continue;
}
if (flagnum) {
tempnum = tempnum * 10 + str[i] - '0';
}
else {
tempden = tempden * 10 + str[i] - '0';
}
}
return;
}
void getnum() {
int temp = tempden * denominator;
numerator *= tempden;
tempnum *= denominator;
denominator = temp;
if (flagin) {
numerator += tempnum;
}
else {
numerator -= tempnum;
}
return;
}
int gcd(int a, int b) {
return !b ? a : gcd(b, a % b);
}
void fraction() {
int gcdm = gcd(abs(numerator), abs(denominator));
numerator /= gcdm;
denominator /= gcdm;
}
int main() {
string str;
long ans = 0;
int n;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
cin >> str;
exchange(str);
if (i == 0) {
numerator = tempnum;
denominator = tempden;
}
else {
getnum();
}
fraction();
}
if (numerator > denominator) {
ans = numerator / denominator;
numerator -= ans * denominator;
if (numerator > 0) {
printf("%d %d/%d", ans, numerator, denominator);
}
else {
printf("%d", ans);
}
}
else {
printf("%d/%d", numerator, denominator);
}
}
代码并未全部AC,最后一个测试点未通过,而且整体代码不够简洁过于冗余,等二刷吧