有理数运算重载
要求:有理数为最简有理数,若分子与分母整除输出整数。
思想总结:
简单代码思想: 1.有理数简化: 判断分子分母大小,取较小值作为辅助变量,用循环for( i=min; i>1; i-- )判断分子分母同时%i,判断余数,当余数为0表示有公因数,且最大公约数将是第一个被提取出。 2.有理数加减:判断操作数双方分母是否相同,用累加方式找最小公倍数,直到双方分母相同,在对分子进行相加减。 3.整数输出:判断分子是否能整除分母,若余数为0,则满足条件。 4.打印:调用行为print,依次对分子分母根据格式 (分子 “/” 分母 )进行输出
代码优化: 1.有理数简化:采用欧立德算法,循环对除数进行求模,在将被除数作为除数,直到余数为0,即获得最大公约数,即当前除数为最大公因数。 2.有理数加减:不用找最小公倍数,直接用公式,这样操作只需一步,效率高。 例如:a/b + a1/b1 = (a * b1 + a1 * b) / b*b1 3.打印:将std类中的左移运算符<<重载,使它能够输出Ration格式的数据。
初版本
#include <iostream>
#include <string>
#include <stdlib.h>
class Ration
{
public
:
Ration();
Ration(int d
, int m
);
Ration operator
+(Ration d
);
Ration operator
-(Ration d
);
Ration operator
*(Ration d
);
Ration operator
/(Ration d
);
void print();
private
:
int molecule
;
int denominator
;
};
Ration
::Ration()
{
denominator
= 0;
molecule
= 0;
}
Ration
::Ration(int d
, int m
)
{
denominator
= d
;
molecule
= m
;
}
Ration Ration
::operator
+(Ration d
)
{
Ration c
;
int mtmp
= molecule
, dtmp
= denominator
;
int mtmp2
= d
.molecule
, dtmp2
= d
.denominator
;
while( mtmp
!= mtmp2
)
{
if(mtmp
< mtmp2
)
{
mtmp
+= molecule
;
dtmp
+= denominator
;
}
else if( mtmp
> mtmp2
)
{
mtmp2
+= d
.molecule
;
dtmp2
+= d
.denominator
;
}
}
c
.molecule
= mtmp
;
c
.denominator
= dtmp
+ dtmp2
;
return c
;
}
Ration Ration
::operator
-(Ration d
)
{
Ration c
;
int mtmp
= molecule
, dtmp
= denominator
;
int mtmp2
= d
.molecule
, dtmp2
= d
.denominator
;
while( mtmp
!= mtmp2
)
{
if(mtmp
< mtmp2
)
{
mtmp
+= molecule
;
dtmp
+= denominator
;
}
else if( mtmp
> mtmp2
)
{
mtmp2
+= d
.molecule
;
dtmp2
+= d
.denominator
;
}
}
c
.molecule
= mtmp
;
c
.denominator
= dtmp
- dtmp2
;
return c
;
}
Ration Ration
::operator
*(Ration d
)
{
Ration c
;
c
.molecule
= molecule
* d
.molecule
;
c
.denominator
= denominator
* d
.denominator
;
return c
;
}
Ration Ration
::operator
/(Ration d
)
{
Ration c
;
c
.molecule
= molecule
* d
.denominator
;
c
.denominator
= denominator
* d
.molecule
;
return c
;
}
void Ration
::print()
{
int i
=0;
if( abs(molecule
) > abs(denominator
) )
{
for(i
=abs(denominator
); i
>1; i
--)
{
if( denominator
% i
== 0 && molecule
% i
== 0 )
{
molecule
/= i
;
denominator
/= i
;
break;
}
}
}
else
{
for(i
=abs(molecule
); i
>1; i
--)
{
if( denominator
% i
== 0 && molecule
% i
== 0 )
{
molecule
/= i
;
denominator
/= i
;
break;
}
}
}
if( denominator
% molecule
== 0 )
std
::cout
<< "整数:" << denominator
<< std
::endl
;
else
std
::cout
<< denominator
<< " / " << molecule
<< std
::endl
;
}
int main()
{
Ration
r1(3,8),r2(13,8),r3
;
r3
= r1
+ r2
;
r3
.print();
r3
= r1
- r2
;
r3
.print();
r3
= r2
* r1
;
r3
.print();
r3
= r2
/ r1
;
r3
.print();
std
::cin
.get();
return 0;
}
优化版本
#include <iostream>
#include <string>
#include <stdlib.h>
class Ration
{
public
:
Ration();
Ration(int m
, int d
);
Ration operator
+(Ration d
);
Ration operator
-(Ration d
);
Ration operator
*(Ration d
);
Ration operator
/(Ration d
);
private
:
void normalize();
int molecule
;
int denominator
;
friend std
::ostream
& operator
<<(std
::ostream
&os
, Ration f
);
};
Ration
::Ration()
{
molecule
= 0;
denominator
= 0;
}
Ration
::Ration(int m
, int d
)
{
molecule
= m
;
denominator
= d
;
normalize();
}
void Ration
::normalize()
{
if( denominator
< 0 )
{
denominator
= -denominator
;
molecule
= -molecule
;
}
int a
= abs( molecule
);
int b
= abs( denominator
);
while( b
> 0 )
{
int t
= a
%b
;
a
=b
;
b
=t
;
}
molecule
/= a
;
denominator
/= a
;
}
Ration Ration
::operator
+(Ration d
)
{
int a
= molecule
, a1
= denominator
;
int b
= d
.molecule
, b1
= d
.denominator
;
int c
= a
*b1
+ a1
*b
;
int f
= a1
* b1
;
return Ration(c
, f
);
}
Ration Ration
::operator
-(Ration d
)
{
int a
= molecule
, a1
= denominator
;
int b
= d
.molecule
, b1
= d
.denominator
;
int c
= a
*b1
- a1
*b
;
int f
= a1
* b1
;
return Ration(c
, f
);
}
Ration Ration
::operator
*(Ration d
)
{
int a
= molecule
, a1
= denominator
;
int b
= d
.molecule
, b1
= d
.denominator
;
int c
= a
* b
;
int f
= a1
* b1
;
return Ration(c
, f
);
}
Ration Ration
::operator
/(Ration d
)
{
int a
= molecule
, a1
= denominator
;
int b
= d
.molecule
, b1
= d
.denominator
;
int c
= a
* b1
;
int f
= a1
* b
;
return Ration(c
, f
);
}
void Ration
::print()
{
if( molecule
% denominator
== 0 )
std
::cout
<< "整数:" << molecule
<< std
::endl
;
else
std
::cout
<< molecule
<< "/" << denominator
<< std
::endl
;
}
std
::ostream
&operator
<<(std
::ostream
&os
, Ration f
);
int main()
{
Ration
r1(3,8),r2(13,8),r3
;
std
::cout
<< r1
<< "+" << r2
<< "=" << (r1
+r2
) << std
::endl
;
std
::cout
<< r1
<< "-" << r2
<< "=" << (r1
-r2
) << std
::endl
;
std
::cout
<< r1
<< "*" << r2
<< "=" << (r1
*r2
) << std
::endl
;
std
::cout
<< r1
<< "/" << r2
<< "=" << (r1
/r2
) << std
::endl
;
return 0;
}
std
::ostream
&operator
<<(std
::ostream
&os
, Ration f
)
{
os
<< f
.molecule
<< "/" << f
.denominator
;
return os
;
}