用c++实现分数(fraction)类

这个想法已经有3周,于是今天将它实现了。

Step 1基础:

我们需要定义一个class——fraction,全部属性定义为public

class fraction{
public:

};

现在,让我们添加2个元素,分子和分母——fz和fw

Step 1.1添加分子分母:

class fraction{
public:
	int fz,fw;
};

Step 2重载运算符:

首先是约分

static fraction teasy(fraction ans){
	int yf=__gcd(ans.fz,ans.fw);
	ans.fz/=yf;
	ans.fw/=yf;
	return ans;
}

接着是lcm(最小公倍数)

static int lcm(int x,int y){
	return x*y/__gcd(x,y);
}

其次是加减乘除,很简单


friend fraction operator+(fraction x,fraction y){
	fraction ans;
	ans.fz=x.fz*y.fw+y.fz*x.fw;
	ans.fw=x.fw*y.fw;
	return teasy(ans);
}
friend fraction operator-(fraction x,fraction y){
	fraction ans;
	ans.fz=x.fz*y.fw-y.fz*x.fw;
	ans.fw=x.fw*y.fw;
	return teasy(ans);
}
friend fraction operator*(fraction x,fraction y){
	fraction ans;
	ans.fz=x.fz*y.fz;
	ans.fw=x.fw*y.fw;
	return teasy(ans);
}
friend fraction operator/(fraction x,fraction y){
	fraction ans;
	swap(y.fz,y.fw);	
    ans.fz=x.fz*y.fz;
	ans.fw=x.fw*y.fw;
		return teasy(ans);
}
friend bool operator>(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz>y.fz)return 1;
	else return 0;
}

当然,逻辑运算符也不能忘记

friend bool operator>(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz>y.fz)return 1;
	else return 0;
}
friend bool operator==(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz==y.fz)return 1;
	else return 0;
}
friend bool operator<(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz<y.fz)return 1;
	else return 0;
}
friend bool operator<=(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz<=y.fz)return 1;
	else return 0;
}
friend bool operator>=(fraction x,fraction y){
	int thard=lcm(x.fw,y.fw);
	x.fz=x.fz*thard/x.fw;
	y.fz=y.fz*thard/y.fw;
	if(x.fz>=y.fz)return 1;
	else return 0;
}

输出函数


static void print(fraction x){
	if(x.fz==0)cout<<"0\n";
	else if(x.fw==1)cout<<x.fz<<"\n";
	else cout<<x.fz<<"/"<<x.fw<<"\n"; 
}

n次方函数

static fraction fipow(fraction x,int y){
	fraction ans=x;
	for(int i=0;i<y-1;i++)ans=ans*x;
	return teasy(ans);
}

绝对值

static fraction frabs(fraction x){
	if(x.fz*x.fw<1){
		x.fz=abs(x.fz);
		x.fw=abs(x.fw);
	}
	return x;
}

完整code:

class fraction{
public:
	int fz,fw;
	static fraction teasy(fraction ans){
		int yf=__gcd(ans.fz,ans.fw);
		ans.fz/=yf;
		ans.fw/=yf;
		return ans;
	}
	static int lcm(int x,int y){
		return x*y/__gcd(x,y);
	}
	friend fraction operator+(fraction x,fraction y){
		fraction ans;
		ans.fz=x.fz*y.fw+y.fz*x.fw;
		ans.fw=x.fw*y.fw;
		return teasy(ans);
	}
	friend fraction operator-(fraction x,fraction y){
		fraction ans;
		ans.fz=x.fz*y.fw-y.fz*x.fw;
		ans.fw=x.fw*y.fw;
		return teasy(ans);
	}
	friend fraction operator*(fraction x,fraction y){
		fraction ans;
		ans.fz=x.fz*y.fz;
		ans.fw=x.fw*y.fw;
		return teasy(ans);
	}
	friend fraction operator/(fraction x,fraction y){
		fraction ans;
		swap(y.fz,y.fw);
		ans.fz=x.fz*y.fz;
		ans.fw=x.fw*y.fw;
		return teasy(ans);
	}
	friend bool operator>(fraction x,fraction y){
		int thard=lcm(x.fw,y.fw);
		x.fz=x.fz*thard/x.fw;
		y.fz=y.fz*thard/y.fw;
		if(x.fz>y.fz)return 1;
		else return 0;
	}
	friend bool operator==(fraction x,fraction y){
		int thard=lcm(x.fw,y.fw);
		x.fz=x.fz*thard/x.fw;
		y.fz=y.fz*thard/y.fw;
		if(x.fz==y.fz)return 1;
		else return 0;
	}
	friend bool operator<(fraction x,fraction y){
		int thard=lcm(x.fw,y.fw);
		x.fz=x.fz*thard/x.fw;
		y.fz=y.fz*thard/y.fw;
		if(x.fz<y.fz)return 1;
		else return 0;
	}
	friend bool operator<=(fraction x,fraction y){
		int thard=lcm(x.fw,y.fw);
		x.fz=x.fz*thard/x.fw;
		y.fz=y.fz*thard/y.fw;
		if(x.fz<=y.fz)return 1;
		else return 0;
	}
	friend bool operator>=(fraction x,fraction y){
		int thard=lcm(x.fw,y.fw);
		x.fz=x.fz*thard/x.fw;
		y.fz=y.fz*thard/y.fw;
		if(x.fz>=y.fz)return 1;
		else return 0;
	}
	static fraction fipow(fraction x,int y){
		fraction ans=x;
		for(int i=0;i<y-1;i++)ans=ans*x;
		return teasy(ans);
	} 
	static fraction ffpow(fraction x,fraction y){
	
	}
	static void print(fraction x){
		if(x.fz==0)cout<<"0\n";
		else if(x.fw==1)cout<<x.fz<<"\n";
		else cout<<x.fz<<"/"<<x.fw<<"\n"; 
	}
	static fraction frabs(fraction x){
		if(x.fz*x.fw<1){
			x.fz=abs(x.fz);
			x.fw=abs(x.fw);
		}
		return x;
	}
};

测试:

test1:

test2:

test3:

test4:

总结:

代码难度不大,码量不大,作用不大(3“不大”代码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值