分数模板(C++模板)
貌似没什么用。。。没有多少毒瘤题要输出分数吧。。。
update:真的有,而且在NOIP模拟赛里出现了!写double的卡精度到怀疑人生!
可以套个兼容性比较好的高精度模板进来。
#include<bits/stdc++.h>
using namespace std;
namespace FlashHu{
#define RG register
#define I inline
#define R RG frac
#define OutputFormat 0
template<typename T>
T gcd(RG T a,RG T b){
return b?gcd(b,a%b):a;
}
template<typename T>
struct frac{
T a,b;
//initializations
I frac(){
a=(T)0;b=(T)1;
}
I frac(RG T x){
a=x;b=(T)1;
}
I frac(RG T x,RG T y){
a=x;b=y;
this->init();
}
I void init(){
assert(b);
if(b<0)a=-a,b=-b;
this->reduction();
}
I frac&operator=(RG T x){
a=x;b=1;
return*this;
}
I double to_double(){
return(double)a/b;
}
//arithmetic operation
I void reduction(){
RG T g=gcd(abs(a),b);
a/=g;b/=g;
}
I frac inv(){
assert(a);
return(frac){b,a};
}
I frac operator-(){
return(frac){-a,b};
}
I frac&operator++(){
a+=b;
return*this;
}
I frac&operator--(){
a-=b;
return*this;
}
I frac&operator+=(R x){
RG T g=gcd(b,x.b);
a=b/g*x.a+x.b/g*a;(b/=g)*=x.b;
this->reduction();
return*this;
}
I frac&operator-=(R x){
return*this+=-x;
}
I frac&operator*=(R x){
RG T g1=gcd(abs(a),x.b),g2=gcd(abs(x.a),b);
(a/=g1)*=x.a/g2;(b/=g2)*=x.b/g1;
return*this;
}
I frac&operator/=(R x){
return*this*x.inv();
}
I frac friend operator+(R x,R y){
RG T g=gcd(x.b,y.b);
x=(frac){x.b/g*y.a+y.b/g*x.a,x.b/g*y.b};
x.reduction();
return x;
}
I frac friend operator-(R x,R y){
return x+-y;
}
I frac friend operator*(R x,R y){
RG T g1=gcd(abs(x.a),y.b),g2=gcd(abs(y.a),x.b);
(x.a/=g1)*=y.a/g2;(x.b/=g2)*=y.b/g1;
return x;
}
I frac friend operator/(R x,R y){
return x*y.inv();
}
//logic operations
I bool operator!(){
return!a;
}
I bool friend operator&&(R x,R y){
return x.a&&y.a;
}
I bool friend operator||(R x,R y){
return x.a||y.a;
}
I bool friend operator==(R x,R y){
return x.a==y.a&&x.b==y.b;
}
I bool friend operator!=(R x,R y){
return x.a!=y.a||x.b!=y.b;
}
#define logop(op) \
I bool friend operator op(R x,R y){ \
return (x+-y).a op 0; \
}
logop(<);logop(>);logop(<=);logop(>=);
#undef logop
//input and output
I friend istream&operator>>(RG istream&is,R&x){
x=0;
static string s;is>>s;
RG int pos=s.find_first_of('/');
if(~pos){
s[pos]=' ';
istringstream(s)>>x.a>>x.b;
x.init();
}
else istringstream(s)>>x.a;
return is;
}
I friend ostream&operator<<(RG ostream&os,R x){
os<<x.a;
if(OutputFormat||x.b!=1)os<<'/'<<x.b;
return os;
}
};
#undef RG
#undef I
#undef R
#undef OutputFormat
}
分数模板(C++模板)的更多相关文章
- C++:类模板与模板类
6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...
- C++:函数模板与模板函数
6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) { return (x>y ...
- C++ template学习一(函数模板和模板函数)
函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...
- vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)
vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...
- .NET/ASP.NETMVC Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(一)
.NET/ASP.NETMVC Model元数据.HtmlHelper.自定义模板.模板的装饰者模式(一) 阅读目录: 1.开篇介绍 2.Model与View的使用关系(数据上下文DataContex ...
- C++类模板和模板类
C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...
- Xamarin XAML语言教程控件模板的模板绑定
Xamarin XAML语言教程控件模板的模板绑定 控件模板的模板绑定 为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能.模板绑定允许控件模板中的控件将数据绑定到公共属性上. ...
- C++模板编程-模板基础重点
模板基础 1.模板参数自动推导,如果是已知的参数类型与个数,这调用模板时可以不写类型. Cout<<max<int>(1,3);可以写为Cout<<max(1,3) ...
- Django——3 模板路径 模板变量 常用过滤器 静态文件的使用
Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创 ...
随机推荐
- HNOI2015做题笔记
HNOI2015 亚瑟王(概率DP) 根据期望的线性性,我们只需要算出每一种卡牌触发的概率就可以算出期望的值 考虑与第\(i\)张卡牌触发概率相关的量,除了\(p_i\)还有前\(i-1\)张卡牌中触 ...
- CF535E Tavas and Pashmaks 单调栈、凸包
传送门 题意:有一场比赛,$N$个人参加.每个人有两种参数$a,b$,如果存在正实数$A,B$使得$\frac{A}{a_i} + \frac{B}{b_i}$在$i=x$处取得最大值(可以有多个最大 ...
- linux的convert图片处理工具
得到一个图片的尺寸, identify test.png 结果为: test.png PNG 178x15 178x15+0+0 16-bit PseudoClass 65536c 2.28kb 使用 ...
- dotnetcore/CAP
CAP带你轻松玩转Asp.Net Core消息队列 CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前 ...
- HTML 5 拖放
拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 拖放事件 1. ...
- rem、em、px、pt及网站字体大小设配
rem:相对的只是HTML根元素字体尺寸; em:相对于当前对象内文本的字体尺寸(值不是固定且继承父级元素的字体大小); px像素(Pixel):对于显示器屏幕分辨率而言的; pt:point,是印刷 ...
- L2-027. 名人堂与代金券
链接:名人堂与代金券 在比赛中这题只得了2分,赛后发现原来strcmp函数并不是只返回-1,0,1三种,而是返回正数负数0 但是在我的电脑上一般就是返回前三种,只是用后面的三种更稳妥点 都怪我基础不扎 ...
- Can't find model 'en'
在使用 nlp = spacy.load("en") 报错OSError: Can't find model 'en' 应该用 python -m spacy download e ...
- git体会
刘仙臣个人github链接:http://www.github.com/liuxianchen 这次作业学会了关于git的一些基本操作,学习了到了许多东西,为以后的学习奠定了基础,激发了学习的兴趣.具 ...
- A glance for agile method
看看Apache最新的JIRA,新版的JIRA是有Agile模块的. Scrum早有耳闻,接触得也比较多,Kanban一次面试中提到过.今日深入查阅KanBan: http://www.agilewe ...