题目
题目链接
求几个分数的和
解题思路
1 分数存储
2 分数化简
3 分数打印
4 分数运算-加
易错点
1 分数化简中,分子为0,分母要记得置为1
2 加和之后记得化简
3 最大公约数的计算使用分子分母绝对值计算,如果最大公约数为负数,化简后格式又不满足符号在分子的要求了
4 假分数的判定为分子绝对值大于分母,因为符号在分子上
单词语法
denominator 分母
numerator 分子
range 范围
rational numbers 有理数
rational 理性的;合理的
Code
Code 01
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
// 分数存储
struct Fraction {
int u;//up
int d;//down
};
// 最大公约数
int gcd(int a, int b) {
if(b==0)return abs(a);
else return gcd(b,a%b);
}
// 分数化简
Fraction reduction(Fraction fra) {
if(fra.d<0) {
// 分母小于0,分子分母同时变号
fra.d*=-1;
fra.u*=-1;
}
if(fra.u==0) {
//分子为0,分母置为1
fra.d=1;
} else {
// 有公约数,消去公约数
int gc = gcd(abs(fra.d),abs(fra.u));
fra.u/=gc;
fra.d/=gc;
}
return fra;
}
// 分数打印
void show(Fraction fra) {
//化简
fra = reduction(fra);
//若分母为1,直接打印分子
if(fra.d==1)printf("%d",fra.u);
// 若为假分数,打印整数+真分数
else if(abs(fra.u)>fra.d) {
printf("%d %d/%d", fra.u/fra.d, abs(fra.u)%fra.d, fra.d);
}else {
printf("%d/%d", fra.u, fra.d);
}
}
// 分数相加
Fraction add(Fraction a, Fraction b) {
Fraction c;
c.u = a.u*b.d+a.d*b.u;
c.d = a.d*b.d;
return reduction(c);
}
int main(int argc,char * argv[]) {
int n;
Fraction ans;
scanf("%d",&n);
for(int i=0; i<n; i++) {
Fraction temp;
scanf("%d/%d",&temp.u,&temp.d);
if(i==0)ans=temp;
else ans = add(ans,temp);
}
show(ans);
return 0;
}
Code 02
#include <iostream>
#include <cstdlib>
using namespace std;
long long gcd(long long a, long long b) {
return b == 0 ? abs(a) : gcd(b, a % b);
}
int main() {
long long n, a, b, suma = 0, sumb = 1, gcdvalue;
scanf("%lld", &n);
for(int i = 0; i < n; i++) {
scanf("%lld/%lld", &a, &b);
gcdvalue = gcd(a, b);
a = a / gcdvalue;
b = b / gcdvalue;
suma = a * sumb + suma * b;
sumb = b * sumb;
gcdvalue = gcd(suma, sumb);
sumb = sumb / gcdvalue;
suma = suma / gcdvalue;
}
long long integer = suma / sumb;
suma = suma - (sumb * integer);
if(integer != 0) {
printf("%lld", integer);
if(suma != 0) printf(" ");
}
if(suma != 0)
printf("%lld/%lld", suma, sumb);
if(integer == 0 && suma == 0)
printf("0");
return 0;
}