posts - 71,  comments - 41,  trackbacks - 0
先贴点人家的教学资料


求最大公约数九法

湖南省武冈市教研室 周定武

  一、观察法

  运用能被2、3、5整除的数的特征进行观察.

  例如,求225和105的最大公约数.因为225、105都能被3和5整除,所以225和105至少含有公约数(3×5)15.因为225÷15=15,105÷15=7.15与7互质,所以225和105的最大公约数是15.

  二、查找约数法
先分别找出每个数的所有约数,再从两个数的约数中找出公有的约数,其中最大的一个
就是最大公约数.

  例如,求12和30的最大公约数.
12的约数有:1、2、3、4、6、12;
30的约数有:1、2、3、5、6、10、15、30.
12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数.

  三、分解因式法

  先分别把两个数分解质因数,再找出它们全部公有的质因数,然后把这些公有质因数相乘,得到的积就是这两个数的最大公约数.

  例如:求125和300的最大公约数.因为125=5×5×5,300=2×2×3×5×5,所以125和300的最大公约数是5×5=25.

  四、关系判断法

  当两个数关系特殊时,可直接判断两个数的最大公约数.例如,两个数互质时,它们的最大公约数就是这两个数的乘积;两个数成倍数关系时,它们的最大公约数就是其中较小的那个数.

  五、短除法

  为了简便,将两个数的分解过程用同一个短除法来表示,那么最大公约数就是所有除数的乘积.

  例如:求180和324的最大公约数.

  因为:

  5和9互质,所以180和324的最大公约数是4×9=36.

  六、除法法

  当两个数中较小的数是质数时,可采用除法求解.即用较大的数除以较小的数,如果能够整除,则较小的数是这两个数的最大公约数.

  例如:求19和152,13和273的最大公约数.因为152÷19=8,273÷13=21.(19和13都是质数.)所以19和152的最大公约数是19,13和273的最大公约数是13.

  七、缩倍法

  如果两个数没有之间没有倍数关系,可以把较小的数依次除以2、3、4……直到求得的商是较大数的约数为止,这时的商就是两个数的最大公约数.例如:求30和24的最大公约数.24÷4=6,6是30的约数,所以30和24的最大公约数是6.

   八、求差判定法

  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.

  
如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和
小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-1676,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4.

  九、辗转相除法

  当两个数都较大时,采用辗转相除法比较方便.其方法是:

  以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.

  例如:求4453和5767的最大公约数时,可作如下除法.

  5767÷4453=1余1314

  4453÷1314=3余511

  1314÷511=2余292

  511÷292=1余219

  292÷219=1余73

  219÷73=3

  于是得知,5767和4453的最大公约数是73.

  辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.




小学数学温习过后,先来个两个数递归版的

int GetGCDRec(int n, int m)
{
    
if (m < n)
    
{
        m 
^= n;
        n 
^= m;
        m 
^= n;
    }


    
if (n == 0)
        
return m;
    
else
        
return GetGCDRec(n, m % n);
}

辗转相除法,求一个数组中所有数的最大公约数

int GetGCD(int *arr, int len)
{
    
int iMax = arr[0], iCurr, iRemainder;

    
for(int i = 1; i < len; i++)
    
{
        iCurr 
= arr[i];

        
if (iMax < iCurr)
        
{
            iMax 
^= iCurr;
            iCurr 
^= iMax;
            iMax 
^= iCurr;
        }


        iRemainder 
= iMax % iCurr;

        
while (iRemainder)
        
{
            iMax 
= iCurr;
            iCurr 
= iRemainder;
            iRemainder 
= iMax % iCurr;
        }

        
        iMax 
= iCurr;
    }
//for

    
return iMax;

}

最小公倍数就是乘积除以最大公约数

int GetLCM(int *arr, int len)
{
    
int multiple = 1;

    
for (int i = 0; i < len; i++)
        multiple 
*= arr[i];

    
return multiple / GetGCD(arr, len);
}




 

posted on 2006-12-04 09:54 Charles 阅读(3488) 评论(1)  编辑 收藏 引用 所属分类: 面试小算法

FeedBack:
# re: 求最大公约数与最小公倍数
2007-12-07 20:38 | yysdsyl
GetLCM求数组最小公倍数有误,应改为如下:
int GetLCM(int m,int n)
{
return m*n/GetGCD(m,n);
}

int GetNLCM(int *arr, int len)
{
if(len==1)
return *arr;
return GetLCM(arr[len-1],GetNLCM(arr,len-1));
}  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

决定开始写工作日记,记录一下自己的轨迹...

常用链接

留言簿(4)

随笔分类(70)

随笔档案(71)

charles推荐访问

搜索

  •  

积分与排名

  • 积分 - 49663
  • 排名 - 452

最新评论

阅读排行榜

评论排行榜