分数类型结构体编写

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
ll gcd(ll a, ll b)
{
	if(b > a)
		swap(a, b);
	if(b%a == 0)
		return a;
	return gcd(a, b%a);
}
struct frac{
	ll numer, denom;
	frac(ll num = 0) { numer = num; denom = num; }
	void simp(){
		ll gcdnum = gcd(numer, denom);
		numer = numer / gcdnum;
		denom = denom / gcdnum;
	}
	void scan(){
		bool point = false, fra = false, pos = true;
		char read = getchar();
		while(read<'0'||read>'9')
		{
			if(read == '.'||read == '/')
			{
				printf("Form Error!\n");
				return;
			}
			if(read == '-')
				pos = false;
			read = getchar();
		}
		while(read == '-'||read == '.'||read == '/'||(read>='0'&&read<='9'))
		{
			if(read == '.')
			{
				point = true;
				read = getchar();
				continue;
			}
			if(read == '/')
			{
				fra = true;
				read = getchar();
				continue;
			}
			if(read == '-')
			{
				pos = false;
				read = getchar();
				continue;
			}
			if(fra)
				denom = denom*10+read-'0';
			else 
			{
				if(point)
           {
					if(denom == 0)
						denom = 10;
					else
					denom = denom*10;
           }
				numer = numer*10+read-'0';
			}
			read = getchar();
		}
		if(denom == 0)
			denom++;
		if(!pos)
			numer = numer*(-1);
		simp();
	}
	void print(){
		simp();
		if(numer == 0)
			printf("0");
		else if(denom == 1)
			printf("%lld", numer);
		else
			printf("%lld/%lld", numer, denom);
	}
	void printpoint(){
		simp();
		printf("%lf", numer*1.0/(denom*1.0));
	}
	frac operator=(const int& b){
		frac ans;
		ans.numer = b;
		ans.denom = 1;
		return ans;
	}
	frac operator=(const double& b){
		double num = b;
		frac ans;
		ans.denom = 1;
		ll ansnumer;
		while(1)
		{
			ansnumer = num*10;
			if(ansnumer%10 == 0)
				break;
			num = num*10;
			ans.denom *= 10;
		}
		ans.numer = b;
		return ans;
	}
	frac operator+(const frac& b){
		frac num = b;
		simp();
		num.simp();
		frac ans;
		ll gcdnum = gcd(denom, num.denom);
		ll pregcd = gcd(gcdnum, denom);
		ll lcmnum = (denom/pregcd)*(num.denom/(gcdnum/pregcd));
		ans.denom = lcmnum;
		ans.numer = numer*(lcmnum/denom)+num.numer*(lcmnum/num.denom);
		return ans;
	}
	frac operator-(const frac& b){
		frac realb;
		realb.numer = (-1)*b.numer;
		realb.denom = b.denom;
		return (*this) + realb;
	}
	frac operator*(const frac& b){
		frac num = b;
		frac ans;
		simp();
		num.simp();
		ll gcdnum = gcd(numer, num.denom);
		ans.numer = numer/gcdnum; ans.denom = num.denom/gcdnum;
		gcdnum = gcd(denom, num.numer);
		ans.numer= ans.numer*(num.numer/gcdnum); ans.denom = ans.denom*(denom/gcdnum);
		return ans;
	}
	frac operator/(const frac& b){
		frac realb;
		realb.numer = b.denom;
		realb.denom = b.numer;
		return (*this) * realb;
	}
	bool operator>(const frac& b) const{
		ll gcdnum = gcd(denom, b.denom);
		ll pregcd = gcd(gcdnum, denom);
		ll lcmnum = (denom/pregcd)*(b.denom/(gcdnum/pregcd));
		return numer*(lcmnum/denom) > b.numer*(lcmnum/b.denom);
	}
	bool operator<(const frac& b) const{return b > *this;}
	bool operator>=(const frac& b) const{return !(b > *this);}
	bool operator<=(const frac& b) const{return !(*this > b);}
	bool operator==(const frac& b) const{return (*this >= b) & (*this <= b);}
	bool operator!=(const frac& b) const{return !(*this == b);}
};
int main()
{
	return 0;
}
posted @ 2021-12-23 23:23  WangZerong  阅读(73)  评论(0)    收藏  举报