2 Star 0 Fork 0

Kenneth-Lee-2012 / card24

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
ana_val.cpp 2.19 KB
一键复制 编辑 原始数据 按行查看 历史
Kenneth Lee 提交于 2022-10-19 11:51 . refine the build structure
// Copyrights by Kenneth Lee, 2022. All Rights Reserved
#include "ana_val.hpp"
AnaVal::AnaVal(int i) {
numer = i;
demom = 1;
state = ST_VAL;
}
AnaVal::AnaVal(int n, int d) {
numer = n;
demom = d;
state = ST_VAL;
simplify();
}
AnaVal::AnaVal() {
state = ST_NON;
numer = demom = 0;
}
AnaVal::AnaVal(const char *s) {
*this = AnaVal(atoi(s));
}
void AnaVal::simplify(void) {
if (state != ValIf::ST_VAL) {
numer = demom = 0;
return;
}
if (demom == 0) {
state = ValIf::ST_INV;
numer = 0;
return;
}
if (demom < 0) {
numer = -numer;
demom = -demom;
}
if (numer == 0)
demom = 1;
// reduction
for (int i = 2, m = min(numer, demom); i <= m;) {
if ((numer % i) == 0 && (demom % i) == 0) {
numer /= i;
demom /= i;
} else
i++;
}
}
bool operator==(const AnaVal &l, const AnaVal &r) {
if (!((ValIf)l).state_compare((ValIf &)r))
return false;
return (l.numer == r.numer ) && (l.demom == r.demom);
}
bool operator==(const AnaVal &l, const int &r) {
return l == AnaVal(r);
}
ostream & operator<<(ostream & os, const AnaVal & v) {
if (v.state !=ValIf::ST_VAL)
((ValIf&)v).show(os);
else {
if (v.numer == 0)
os << "0";
else if (v.demom == 1)
os << v.numer;
else
os << "(" << v.numer << "/" << v.demom << ")";
}
return os;
}
AnaVal operator+(const AnaVal &l, const AnaVal &r) {
AnaVal ret;
if (((ValIf&)ret).op_init(l, r)) {
ret.numer = l.numer * r.demom + r.numer * l.demom;
ret.demom = l.demom * r.demom;
ret.simplify();
}
return ret;
}
AnaVal operator-(const AnaVal &l, const AnaVal &r) {
AnaVal ret;
if (((ValIf&)ret).op_init(l, r)) {
ret.numer = l.numer * r.demom - r.numer * l.demom;
ret.demom = l.demom * r.demom;
ret.simplify();
}
return ret;
}
AnaVal operator*(const AnaVal &l, const AnaVal &r) {
AnaVal ret;
if (((ValIf&)ret).op_init(l, r)) {
ret.numer = l.numer * r.numer;
ret.demom = l.demom * r.demom;
ret.simplify();
}
return ret;
}
AnaVal operator/(const AnaVal &l, const AnaVal &r) {
AnaVal ret;
if (((ValIf&)ret).op_init(l, r)) {
ret.numer = l.numer * r.demom;
ret.demom = l.demom * r.numer;
ret.simplify();
}
return ret;
}
AnaVal & AnaVal::operator=(const char *s) {
*this = AnaVal(atoi(s));
return *this;
}
C++
1
https://gitee.com/Kenneth-Lee-2012/card24.git
git@gitee.com:Kenneth-Lee-2012/card24.git
Kenneth-Lee-2012
card24
card24
master

搜索帮助