因为powerScript语法为我最熟悉的,所以选择用它实现。其它语言的语法大家可自行转换,不好意思.
下面是函数内容:
//====================================================================
// Function: nvo_arith_math::of_gcd()
//--------------------------------------------------------------------
// Description:
求最大公约数
(greatest common divisor)
的
"
辗转相除法
"
// (
给出两个数,将大数除以小数,用所得余数替换大数,继续用这两个
//
数中大者除以小者,用所得余数替换较大者,继续下去,直到所得余数为
// 0
,此时除数即为所求的最大公约数。
//
下面是一个实例:
(15, 21) = (15, 6) = (3, 6) = (3, 0) = 3)
//--------------------------------------------------------------------
// Arguments:
// readonly longlong all_num[]
待比较的数
//--------------------------------------------------------------------
// Returns: longlong
//--------------------------------------------------------------------
// Author: renwanly Date: 2007.03.12
//--------------------------------------------------------------------
// Modify History:
//
//====================================================================
longlong lll_num[],lll_mod
UnsignedInteger lui_cnt,i
lui_cnt = UpperBound(all_num[])
CHOOSE CASE lui_cnt
CASE 2 //
只有两个数
,
核心比较算法
IF all_num[1] >= all_num[2] THEN
lll_mod = Mod(all_num[1],all_num[2])
IF lll_mod = 0 THEN
RETURN all_num[2]
ELSE
RETURN of_gcd({all_num[2],lll_mod})
END IF
ELSE
lll_mod = Mod(all_num[2],all_num[1])
IF lll_mod = 0 THEN
RETURN all_num[1]
ELSE
RETURN of_gcd({all_num[1],lll_mod})
END IF
END IF
CASE 0,1 //
如果没有数或只有
1
个数
,
则错误
RETURN 0
CASE ELSE //
有多个数
,
递归调用此方法
FOR i = 1 To Truncate(lui_cnt/2,0)
lll_num[i] = of_gcd({all_num[i*2 - 1],all_num[i*2]})
NEXT
IF Mod(lui_cnt,2) = 1 THEN lll_num[UpperBound(lll_num[])+1] = all_num[lui_cnt]
RETURN of_gcd( lll_num[])
END CHOOSE
|