分数类-初级版
这几天刚刚学了一些C++类的知识,像什么成员函数,非成员函数,构造函数之类的。于是就想着自己写了一个兼容整数和分数的分数类,虽然现在还不知道怎么重载+,-,*,>>等运算符,不过先写一个,以后学了再改进就是了。
代码如下:
#include<bits/stdc++.h> using namespace std; struct Spnumber { Spnumber()=default; Spnumber(const int &a,const int &b):u(a),d(b){} Spnumber(const int &a):u(a){} Spnumber(istream& is) { istream &read(istream&,Spnumber&); read(is,*this); } Spnumber &combine(const Spnumber&other) { u=u*other.d+d*other.u; d*=other.d; int x=__gcd(u,d); if(x!=0) { u/=x; d/=x; } return *this; } Spnumber &remove(const Spnumber&other) { u=u*other.d-d*other.u; d*=other.d; int x=__gcd(u,d); if(x!=0) { u/=x; d/=x; } return *this; } Spnumber &multiplication(const Spnumber&other) { u*=other.u; d*=other.d; int x=__gcd(u,d); if(x!=0) { u/=x; d/=x; } return *this; } Spnumber &division(const Spnumber&other) { swap(u,d); u*=other.u; d*=other.d; int x=__gcd(u,d); if(x!=0) { u/=x; d/=x; } swap(u,d); return *this; } int u=0,d=1; }; istream &read(istream &is,Spnumber &temp) { string u; is>>u; int i,x=0; for(i=0;i<u.size()&&u[i]!='/';i++) x=(x<<1)+(x<<3)+u[i]-'0'; temp.u=x; if(i==u.size())return is; for(++i,x=0;i<u.size();i++) x=(x<<1)+(x<<3)+u[i]-'0'; temp.d=x; return is; } ostream &print(ostream &os,const Spnumber &temp) { os<<temp.u; if(temp.u && temp.d!=1)cout<<'/'<<temp.d; return os; } // Spnumber::Spnumber(istream &is) // { // read(is,*this); // } Spnumber &add(const Spnumber&a1,const Spnumber&a2) { Spnumber sum=a1; return sum.combine(a2); } Spnumber &Minus(const Spnumber&a1,const Spnumber&a2) { Spnumber ans=a1; return ans.remove(a2); } Spnumber &multiply(const Spnumber&a1,const Spnumber&a2) { Spnumber ans=a1; return ans.multiplication(a2); } Spnumber ÷(const Spnumber&a1,const Spnumber&a2) { Spnumber ans=a1; return ans.division(a2); } int main() { freopen("A.in","r",stdin); freopen("A.out","w",stdout); Spnumber a(cin); Spnumber b(cin); // print(cout,a); // cout<<endl; // print(cout,b); vector<Spnumber&(*)(const Spnumber&,const Spnumber&)>s; s.push_back(add); s.push_back(Minus); s.push_back(multiply); s.push_back(divide); for(auto c:s) { print(cout,c(a,b)); cout<<endl; } return 0; }