求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法

来源:互联网 发布:linux c语言视频教程 编辑:程序博客网 时间:2024/06/01 17:43

http://www.cppblog.com/linqiu/archive/2007/08/01/29145.html

#include <iostream>#include <cmath>using namespace std;int gcd(int a, int b);int ngcd(int *a, int n);int lcm(int a, int b);int nlcm(int *a, int n);int main(){ //int a,b; //cin >> a >> b; //cout << lcm(a, b) << endl; int *a = new int[3]; a[0] = 3; a[1] = 4; a[2] = 5; cout << nlcm(a, 3) << endl; return 0;}//两个数的最大公约数--欧几里得算法int gcd(int a, int b){ if (a < b)  swap(a, b); if (b == 0)  return a; else  return gcd(b, a%b);}//n个数的最大公约数算法//说明: //把n个数保存为一个数组//参数为数组的指针和数组的大小(需要计算的数的个数)//然后先求出gcd(a[0],a[1]), 然后将所求的gcd与数组的下一个元素作为gcd的参数继续求gcd//这样就产生一个递归的求ngcd的算法int ngcd(int *a, int n){ if (n == 1)  return *a; return gcd(a[n-1], ngcd(a, n-1));}//两个数的最小公倍数(lcm)算法//lcm(a, b) = a*b/gcd(a, b)int lcm(int a, int b){ return a*b/gcd(a, b);}//n个数的最小公倍数算法//算法过程和n个数的最大公约数求法类似//求出头两个的最小公倍数,再将欺和大三个数求最小公倍数直到数组末尾//这样产生一个递归的求nlcm的算法int nlcm(int *a, int n){ if (n == 1)  return *a; else  return lcm(a[n-1], nlcm(a, n-1));}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没有学历的我该怎么办 补过的牙掉了怎么办 法院判完被告不给钱怎么办 b证到期未继续教育怎么办 宝宝上幼儿园中午要用尿不湿怎么办 嫁到北京农村怎么办居住证 2020年没脱贫的农民怎么办 2020年农民的土地怎么办 车停在停车场被划怎么办 专升本差两分怎么办 入职需要学士学位证怎么办 不喜欢写科研项目又没编制怎么办 易学堂密码忘了怎么办 易班手机号换了怎么办 易班登录不上怎么办 易到手机号换了怎么办 海外留学没有教育部认证怎么办 七过月宝宝便秘怎么办 6个月孩子便秘怎么办 6个月婴儿便秘怎么办 一个多月宝宝两天没拉大便怎么办 7个月宝宝便秘怎么办 9个月宝宝便秘怎么办 六个月宝宝严重便秘怎么办 公司调岗员工不同意怎么办 acca注册一直在审核怎么办 ieee ap二审被拒怎么办 文章投到假期刊怎么办 论文投了假网站怎么办 网上传了虚假的怎么办? 网上做兼职被骗了钱怎么办 通过支付宝扫码被骗了怎么办 支付宝扫二维码被骗怎么办 在is上被骗了怎么办 微信兼职被骗怎么办天涯论坛 公众号不给稿费怎么办 围绕服务改善民生提出怎么办 翰墨香林苑怎么办全产权 西城高铁联名卡怎么办 英语教学系统做题时超时了怎么办 sci被要求撤稿怎么办