猫史档案馆


【C++】自制分数模板

用户:AlcalaAlcala查看: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);
}

其实还有循环小数化分数没做,因为用处不大。(其实是我懒()()()()()())

欢迎使用


回复

上一页1 页 / 共 1下一页
AlcalaAlcala

沙发,舒服

点赞1


评论


幻想一笑而过幻想一笑而过

板凳

点赞1


评论


XYS林深时见鹿XYS林深时见鹿

太空舱,舒服

点赞1


评论


umbrallawwumbrallaww

前排

点赞1


评论


荷花编程荷花编程

前排

点赞1


评论


醉醉白凰醉醉白凰

头文件最好不要用bits/stdc++.h

里面包括的函数太多了,占空间

点赞0


评论


AlcalaAlcala

喵d

点赞0


评论