辗转相除法的应用

  • 题目: 设计实现抽象数据结构"有理数",基本操作包括有理数的加减乘除,以及求有理数的分子分母

  • 思路: 设计这个数据结构很简单,但是当时在如何得到有理数的分子分母上楞了一下,后来重新思考了,大概过程:

    1. 用字符串接收一个小数形式的有理数,例如"1.234" 转化为浮点数 1.234
    2. 所有有理数都可以如1.234一样写成1234 / 1000的形式
    3. 12341000的最大公约数为2,然后12341000分别除去它即可分别得到最简分子分母617500
  • 求最大公约数的算法(辗转相除法)
    具体做法:

用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是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);
 }

你可能感兴趣的:(辗转相除法的应用)