用户:
Alcala查看:9 回复:7 评论:9 创建时间:2021-06-05T15:40:26
这个模板想用拿走即可,虽然用处不大()
但前几年NOIp有道题一定要用分数,浮点数卡精度到崩溃()
所以就用半个多小时写了个分数模板,欢迎指出错误
支持运算:约分 通分 分数加分数 分数减分数 分数加整数 分数减整数 分数乘整数 分数除整数 分数乘分数 分数除分数 比较两个分数的大小 分数化浮点数
话不多说,上代码:
#include<bits/stdc++.h>
#define ft fraction //定义分数
#define ap approximate_points //约分
#define gd general_division //通分
#define addf addition_by_fraction //分数加分数
#define subf subtraction_by_fraction //分数减分数
#define addi addition_by_integer //分数加整数
#define subi subtraction_by_integer //分数减整数
#define mbi multiplication_by_integer //分数乘整数
#define dbi division_by_integer //分数除整数
#define mbf multiplication_by_fraction //分数乘分数
#define dbi division_by_fraction //分数除分数
#define cv comparative_value //比较两个分数的大小
#define ffpn fractional_floating_point_number //分数化浮点数
/*
不支持,有需要可用:
#define int long long
#define double long double
*/
using namespace std;
int __lcm(int a,int b){ //最小公倍数
return a * b / __gcd(a,b);
}
struct fraction{ //分数结构体
int molecule;
int denominator;
};
fraction approximate_points(fraction a){ //约分
int g = __gcd(a.molecule,a.denominator);
fraction b;
b.denominator = a.denominator / g;
b.molecule = a.molecule / g;
return b;
}
pair<fraction,fraction> general_division(fraction a,fraction b){ //通分
int l = __lcm(a.denominator,b.denominator);
fraction c,d;
c.denominator = l;
c.molecule = l / a.denominator * a.molecule;
d.denominator = l;
d.molecule = l / b.denominator * b.molecule;
return make_pair(c,d);
}
fraction addition_by_fraction(fraction a,fraction b){ //分数加分数
fraction c;
c.denominator = a.denominator * b.denominator;
c.molecule = a.molecule * b.denominator + a.denominator * b.molecule;
return approximate_points(c);
}
fraction subtraction_by_fraction(fraction a,fraction b){ //分数减分数
fraction c;
c.denominator = a.denominator * b.denominator;
c.molecule = a.molecule * b.denominator - a.denominator * b.molecule;
return approximate_points(c);
}
fraction addition_by_integer(fraction a,int b){ //分数加整数
fraction c;
c.denominator = a.denominator;
c.molecule = a.molecule + b * a.denominator;
return approximate_points(c);
}
fraction subtraction_by_integer(fraction a,int b){ //分数减整数
fraction c;
c.denominator = a.denominator;
c.molecule = a.molecule - b * a.denominator;
return approximate_points(c);
}
fraction multiplication_by_integer(fraction a,int b){ //分数乘整数
fraction c;
c.denominator = a.denominator;
c.molecule = a.molecule * b;
return approximate_points(c);
}
fraction division_by_integer(fraction a,int b){ //分数除整数
fraction c;
c.denominator = a.denominator * b;
c.molecule = a.molecule;
return approximate_points(c);
}
fraction multiplication_by_fraction(fraction a,fraction b){ //分数乘分数
fraction c;
c.denominator = a.denominator * b.denominator;
c.molecule = a.molecule * b.molecule;
return approximate_points(c);
}
fraction division_by_fraction(fraction a,fraction b){ //分数除分数
fraction c;
c.denominator = a.denominator * b.molecule;
c.molecule = a.molecule * b.denominator;
return approximate_points(c);
}
int comparative_value(fraction a,fraction b){ //比较大小
fraction c = general_division(a,b).first;
fraction d = general_division(a,b).second;
int a_value = c.molecule * d.denominator;
int b_value = c.denominator * d.molecule;
if(a_value > b_value) return 1;
else if(a_value == b_value) return 0;
else return -1;
}
double fractional_floating_point_number(fraction a){ //分数化浮点数
double c = a.molecule;
double d = a.denominator;
return c / d;
}
int main(){ //主函数,记住如果用了#define int long long要signed main()
fraction a,b;
scanf("%d%d%d%d",&a.molecule,&a.denominator,&b.molecule,&b.denominator);
/*
做点什么
*/
printf("%d %d %d %d",a.molecule,a.denominator,b.molecule,b.denominator);
}
其实还有循环小数化分数没做,因为用处不大。(其实是我懒()()()()()())
欢迎使用