加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

辗转相除法和求余函数

(2011-11-24 13:09:26)
标签:

杂谈

用辗转相除法求最大公约数 算法: 先用小的一个数除大的一个数,得第一个余 数; 再用第一个余数除小的一个数,得第二个余 数; 又用第二个余数除第一个余数,得第三个余 数; 这样逐次用后一个数去除前一个余数,直到 余数是0为止。那么,最后一个除数就是所 求的最大公约数(如果最后的除数是1,那 么原来的两个数是互质数)。 2011-7-1 C 语言 1 举例:求1515和600的最大公约数 第一次:1515÷600,商2余315; 第二次:600÷ 315 ,商1余285; 第三次:315 ÷ 285 ,商1余30; 第四次:285 ÷ 30 ,商9余15; 第五次:30 ÷ 15 ,商2余0; 1515和600的最大公约数是15 2011-7-1 C 语言 2 算法2: 1 比较m与n的大小,将小的数赋值给min; 2 从min到1,依次与m,n做余运算,如果余数都 为0,则此数为最大余数,否则继续循环。 如:求6和4的最大公约数。 Min = 4; 第一次:4%4=0, 6%4 = 2, 所以4不是最大公约 数; 第二次: 4%3=1,6%3 =0,所以3不是最大公约 数; 第三次: 4%2=0, 6%3=0,所以2是最大公约数;
如果你不仔细区分的话,可以把rem和mod都当作是求余数的命令。比如,
>> mod(3,2)

ans =

1

>> rem(3,2)

ans =

1
可是,通过看他们的帮助文件可以知道,这两个数的符号一致时的结果是一样的,但是当两个数的符号不一样时,就会出现不同了。
>> mod(3,-2)

ans =

-1

>> rem(3,-2)

ans =

1
主要区别在rem(x,y)命令返回的是x - n.*y,如果y不等于0,其中的n = fix(x./y),而MOD(x,y)返回的是x - n.*y,当y不等于0时,n = floor(x./y)

因此他们之间的区别主要在与fix与floor的区别。fix是想最近的整数取整,而floor是向负无穷取整

0

阅读 收藏 喜欢 打印举报/Report
后一篇:Qt编译步骤
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有