设为首页 加入收藏

TOP

数论初步-欧几里得算法
2017-10-12 17:51:19 】 浏览:9435
Tags:数论 初步 欧几 算法
1 int judge(int* X) {
2 X[2] /= gcd(X[2], X[1]);
3 for(int i = 3; i <= k; i++) X[2] /= gcd(X[i], X[2]);
4 return X[2] == 1;
5 }

这个算法称为欧几里得算法。不会溢出,因为 gcd函数的递归层数不超过4.785lgN + 1.6723,其N=max{a,b}gcd递归层数最多的是gcd(Fn,Fn-1)。利用gcd还可以求出两个整数a和b的最小公倍数lcm(a,b)。 这个结论很容易由唯一分解定
理得到。由此不难验证gcd(a,b)*lcm(a,b)=a*b。

不过即使有了公式也不要大意。 如果把lcm写成a *b/gcd(a,b),可能会因此丢掉不少分数——a*b可能会溢出!正确的写法是先除后乘,即a/gcd(a,b) * b。 这样一来,只要题面上保证最终结果在int范围之内,这个函数就不会出错。
但前一份代码却不是这样:即使最终答案在int范围之内,也有可能中间过程越界。 注意这样
的细节,毕竟算法竞赛不是数学竞赛。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Qt 使用QMovie加载gif图片实现动.. 下一篇顺序容器:vector,deque,list

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目