您的位置:首页 > 产品设计 > UI/UE

算法.数学.初级.求最大公约数--辗转相除法,powerbuilder powerscript实现

2007-03-12 17:07 531 查看
因为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

对于此算法的优劣及修正方案需要大家积极的评论!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息