有理数类的定义与实现

有理数类的定义与实现一个有理数是由一个分子和分母组成的a/b形式的数

一个有理数是由一个分子和分母组成的a/b形式的数。我们知道一般程序语言里已经定义了整形类,浮点型,字符型,但并不支持有理数型。这对于分数的精确计算如1/3=0.33333….不能用double 或者float精确表示,所以有必要自己定义一个有理数类Rational类:

含有分子nume和分母deno两个数据域;

可以进行加减乘除比较,转换等多种函数

定义的类如下:

int gys(int x,int y){
	x=abs(x);
	y=abs(y);
int t=1;
int f=1;
while(t<=x&&t<=y){
  int re1=x%t;
  int re2=y%t;
if(re1==0&&re2==0) f=t;
t++;}
return f;}//求得最大公约数
int gbs(int x,int y){
		x=abs(x);
	y=abs(y);
int f=1;
int t=x*y;
while(t>=x&&t>=y){
int re1=t%x;
int re2=t%y;
if(re1==0&&re2==0) f=t;
t--;}
return f;}//求得最小公倍数
class Rational{
private:
  long nume;
long deno;
public:
	Rational(){nume=0;deno=1;}
	Rational(long nume,long b){this->nume=nume;deno=b;}
	long getnume(){return nume;}
	long getdeno(){return deno;}
	Rational getadd(Rational &s){
		int deno1=gbs(deno,s.getdeno());
	    int fnume1=deno1/deno;
		int fnume2=deno1/s.getdeno();
		int nume1=fnume1*nume+fnume2*s.getnume();
	     int gbs=gys(deno1,nume1);
	int nume2=nume1/gbs;
	int deno2=deno1/gbs;
	Rational add(nume2,deno2);
	return add;}//有理数加法,按照四则运算分数相加法则
Rational getsub(Rational &s){
		int deno1=gbs(deno,s.getdeno());
	    int fnume1=deno1/deno;
		int fnume2=deno1/s.getdeno();
		int nume1=fnume1*nume-fnume2*s.getnume();
	     int gbs=gys(deno1,nume1);
	int nume2=nume1/gbs;
	int deno2=deno1/gbs;
	Rational sub(nume2,deno2);
	return sub;}//有理数减法,按照四则运算分数相减法则
Rational getmin(Rational &s){
	int nume1=nume*s.getnume();
	int deno1=deno*s.getdeno();
int gys1=gys(nume1,deno1);
int nume2=nume1/gys1;
int deno2=deno1/gys1;
Rational sub(nume2,deno2);
	return sub;}//有理数乘法,直接对应相乘,然后化简
Rational getdiv(Rational &s){
	int snume=s.getdeno();
	int sdeno=s.getnume();
Rational s1(snume,sdeno);
return getmin(s1);}//有理数除法,除数倒置以后的乘法
int com( Rational &s){
	int deno1=gbs(deno,s.getdeno());
    int fnume1=deno1/deno;
	int fnume2=deno1/s.getdeno();
    int nume1=fnume1*nume;
	int nume2=fnume2*s.getnume();
if(nume1>nume2) return 1;
else if(nume1==nume2) return 0;
else return -1;}//有理数比较,先雷同有理数加减,化成分母相同,直接比较分子即可

bool equ(Rational &s){
if(com(s)==0) return true;
else return false;}//直接利用已有的比较函数
int intval(){
return nume/deno;}
double doubleval(){
return 1.0*nume/deno;}
string tostring(){
	char *str=new char[22];
	char *str1=new char[22];
	if(deno==1)  {itoa(nume,str,10);return str;}
	else {itoa(nume,str,10);itoa(deno,str1,10);
	string s1(str);
	string s2(str1);
	s1.append(1,'/');
	s1.append(s2);
	return s1;}}//涉及到数和字符串转换itoa(),涉及到字符串到string 转换
private:
	long gcd(long x,long y){
	x=abs(x);
	y=abs(y);
long t=1;
long f=1;
while(t<=x&&t<=y){
  int re1=x%t;
  int re2=y%t;
if(re1==0&&re2==0) f=t;
t++;}
return f;}//求n,d的公约数
};

调用:

inline void dis(Rational &s){
	cout<<"result:"<<s.getnume()<<"/"<<s.getdeno()<<endl;}
int main(){
	int a=37,b=10;
	Rational a1(2,6);
	//cout<<"enter two:"<<endl;
	//cin>>a>>b;
	Rational b1(a,b);

	Rational add=a1.getadd(b1);
	dis(add);
	Rational sub=a1.getsub(b1);
	dis(sub);
	Rational min=a1.getmin(b1);
	dis(min);
	Rational div=a1.getdiv(b1);
	dis(div);
	cout<<a1.com(b1)<<endl;
	cout<<a1.equ(b1)<<endl;
	cout<<a1.tostring()<<endl;
system("pause");
return 0;}

实现结果如图:

有理数类的定义与实现

这样以后不仅仅有int,float,double等数据类,还有有理数类参与计算了。

今天的文章有理数类的定义与实现分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65546.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注