题目: 设计实现抽象数据结构"有理数",基本操作包括有理数的加减乘除,以及求有理数的分子分母
-
思路: 设计这个数据结构很简单,但是当时在如何得到有理数的分子分母上楞了一下,后来重新思考了,大概过程:
- 用字符串接收一个小数形式的有理数,例如
"1.234"
转化为浮点数1.234
- 所有有理数都可以如
1.234
一样写成1234 / 1000
的形式 - 求
1234
和1000
的最大公约数为2,然后1234
和1000
分别除去它即可分别得到最简分子分母617
和500
- 用字符串接收一个小数形式的有理数,例如
求最大公约数的算法(辗转相除法)
具体做法:
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
代码:
int gcd(int ob1,int ob2){
int temp;
if(ob1 < ob2){ //总是用大数对小数取模
temp=ob1;
ob1=ob2;
ob2=temp;
}
if(!ob2) //递归基
return ob1;
else
return gcd(ob1%ob2,ob2);
}
改写为更简洁的形式:
int gcd(int ob1,int ob2){
return ob2==0? ob1:gcd(ob2, ob1 % ob2);
}