欧几里得算法求n个数据的最大公约数
2016-06-29 17:03
302 查看
我们知道,欧几里得算法可以简单的看作是——求p,q的最大公约数可以这样处理,即p除以q的余数r,则p,q的最大公约数为q与r的最大公约数,然后递归。若规定当一个数p为0的时候, 则最大的公约数为q.
两个数的简单求公约数如下算法:
那么,如果是求n个数据的最大公约数?计算机不会全部扫描一遍后就直接给出答案了,核心用到的还是欧几里得算法,只是每次两个数据求最大公约数的时候,其中的一个数为之前数据的最大公约数,而求出这个两个数据后的最大公约数后,又作为求与另一个数据的最大公约数,有点绕,比如求三个数据4,6,12的最大公约数,4和6的最大公约数为2,然后2再与12求最大公约数为2.
我这里用到的是数组保存的输入的数据,然后遍历一遍,输出结果。
两个数的简单求公约数如下算法:
int gcd(int p,int q){ if(p==0) return q; int r=p%q; return gcd(q,r) ; }很简单的几行代码,却把欧几里得算法辗转相除的思想说明了。
那么,如果是求n个数据的最大公约数?计算机不会全部扫描一遍后就直接给出答案了,核心用到的还是欧几里得算法,只是每次两个数据求最大公约数的时候,其中的一个数为之前数据的最大公约数,而求出这个两个数据后的最大公约数后,又作为求与另一个数据的最大公约数,有点绕,比如求三个数据4,6,12的最大公约数,4和6的最大公约数为2,然后2再与12求最大公约数为2.
我这里用到的是数组保存的输入的数据,然后遍历一遍,输出结果。
#include <iostream> //辗转相除求n个数的最大公约数 using namespace std; int grc(int p,int q){ if(q==0) return p; int r=p%q; return grc(q,r); } int main() { int a[101];//存储要计算公约数的数据 int m; cout<<"请输入要求公约数数据的个数:"<<endl; cin>>m; for(int i=1;i<=m;i++){ cin>>a[i]; } int x=0;//0与任意数(w)的最大公约数规定为w for(int i=1;i<=m;i++){ x=grc(x,a[i]); } cout<<x; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法