求一组数的最大公约数和最小公倍数

问题描述
1.【简单练习】求N个数的最大公约数和最小公倍数
2.【提高练习】Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:
①x和a0的最大公约数是a1;
②x和b0的最小公倍数是b1。
Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。
输入格式 : 输入第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。
输出格式输出共n行。每组输入数据的输出结果占一行,为一个整数。对于每组数据:若不存在这样的x,请输出0;若存在这样的x,请输出满足条件的x的个数;
样例输入:

41 1 96 288
95 1 37 1776

样例输出:

6
2

解题思路
①求一组数最大公约数和最小公倍数
用gcd()函数求出前两个数的最大公约数,用这两个数求得的这个最大公约数和后一位数求最大公约数,以此类推,最后求得一组数的最大公约数。最小公倍数可以用两个数相乘除以最大公约数来计算,这里就要用到上边的gcd()函数,通过循环,来求一组数的最小公倍数和最大公约数一样的道理。
②Hankson问题
通过阅读题目就可以得到两个简单的函数gcd(x,a0)=a1(x和a0的最大公约数为a1);lcm(x,b0)=b1;(x和b0的最小公倍数为b1)
然后通过最小公倍数可以用两个数相乘除以最大公约数来计算这个方法,来变换这两个函数,最后得到gcd(x/a1,a0/a1)==1;gcd(b1/b0,b1/x)==1;(gcd()函数作用是用辗转相除法求两个数的最大公约数)这两个式子,这两个式子就是求x的条件语句,x满足两个函数则累加,最后求得x的个数。
源代码
求一组数的最大公约数和最小公倍数源代码

#include<iostream>
using namespace std;
//辗转相除法
int gcd(int a,int b)
{int temp;if(a<b)         //用a来存大数{temp=a;a=b;b=temp;}while(b!=0){temp=a%b;a=b;b=temp;}return a;
}
int main()
{int row,col,i;cout<<"输入数的个数:";
//用动态一维数组来存放数字cin>>row ;int *a ;a=new int [row] ;
//输入一维数组的值cout<<"输入数字:";for(i=0;i<row;i++)cin>>a[i];int maxfac,minmul;//定义最大公约数和最小公倍数maxfac=gcd(a[0],a[1]);minmul=(a[0]*a[1])/gcd(a[0],a[1]); //最小公倍数也可以用它们相乘除以最大公约数来计算for(i=0;i<row;i++){maxfac=gcd(maxfac,a[i]);//调用函数求一组数的最大公约数minmul=((minmul*a[i])/gcd(minmul,a[i])); }cout<<"最大公约数为:"<<maxfac<<endl;cout<<"最小公倍数:"<<minmul<<endl;
//释放一维数组
delete [] a ;
}

求Hankson问题源代码

#include<iostream>
using namespace std;
int gcd(int a,int b)//辗转相除法求最大公约数
{int temp;if(a<b)      //用a存较大的数{temp=a;a=b;b=temp;}while(b!=0){temp=a%b;a=b;b=temp;}return a;
}
int main()
{int n,a0,a1,b0,b1,x,ans;cout<<"请输入组数:";cin>>n;if(n<0){cout<<"输入数据错误,请输入正整数"<<endl;} while(n>0){ans=0;cout<<"请依次输入a0,a1,b0,b1(保证a0能被a1整除,b1能被b0整除):"<<endl;cin>>a0>>a1>>b0>>b1;for(int i=1;i<=b1;i++)//找符合条件的xif(b1%i==0){x=i;if(x%a1==0)if(gcd(a0/a1,x/a1)==1&&gcd(b1/b0,b1/x)==1)//x满足的条件ans++;}cout<<"满足条件的个数有"<<ans<<"个"<<endl;n--;//退出while循环}
}

经验总结
这次作业练习学到了一种新的求最小公倍数的思维方法(用两个数相乘除以最大公约数来计算),在要同时求最大公约数和最小公倍数时,这种方法更加简便。很好的锻炼了思维能力,之前看见编程的题目一头雾水,不知道从哪开始思考分析,现在练习了能多编程的题目,实际操作,学到很多东西,也慢慢学会了怎样分析问题,用什么样的方法,还有解决问题的思路,要逻辑分明,条理清晰。比如说Hankson的问题,读完题目就可以写出两个函数gcd(x,a0)=a1;lcm(x,b0)=b1;根据这两个式子和上边求最小公倍数的方法得到另外两个推导式gcd(x/a1,a0/a1)==1;gcd(b1/b0,b1/x)==1;就出现了求x的两个条件,这个推导也是参考了很多网上的例子,知道了方法编程也就变容易了点。自己的思维逻辑能力还是有点差,还是要多实践,多编一些程序,锻炼锻炼逻辑能力。

求一组数的最大公约数和最小公倍数相关推荐

  1. Python求一组数字的最大公约数和最小公倍数

    一.先来看求最大公约数 1).利用gcd函数 math库里面有个gcd函数能直接求出两个数字的最大公约数,遇到求一组数字的最大公约数的时候,加一个循环就好,如下: import math def gc ...

  2. 求一组数的最大公因数和最小公倍数

    求一组数的最大公因数和最小公倍数 求两个数的最大公因数和最小公倍数 1.辗转相除法 2.更相减损术 这里采用辗转相除法 #include <iostream> using namespac ...

  3. python求两数最大公因数_『用python求俩个数的最大公约数和最小公倍数』

    python:用递归的方法编写一个函数gys(x,y),计算两个数字的最大公约数. (提示,大的 def gys(x,y): a,b=max(x,y),min(x,y) c=a%b if c==0: ...

  4. 求N个数的最大公约数和最小公倍数以及Hankson逆问题(python)

    求N个数的最大公约数和最小公倍数以及Hankson"逆问题"(python) 一.题目要求 1.基本要求: 求N个数的最大公约数和最小公倍数.用C或C++或java或python语 ...

  5. 百度web前端面试题之求两个数的最大公约数和最小公倍数

    求两个数的最大公约数和最小公倍数,好像是第三题, 找到如下简洁写法: <1> 用辗转相除法求最大公约数 算法描述: m对n求余传给自己,再次求余, 若余数等于0 则 n 为最大公约数 &l ...

  6. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...

    详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...

  7. c语言用迭代法求最大公约数,用迭代法求两个数的最大公约数和最小公倍数

    c语言论文 用迭代法求两个数的最大公约数和最小公倍数 化工09110605 摘要:迭代法是一种循环控制语句和循环结构程序的设计方法.在计算机解决问 题的时候,总希望从复杂的问题中找到规律,并归结为简单 ...

  8. 求多个数的最大公约数和最小公倍数,用三种方法实现。

    题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约 ...

  9. 【经典100题】 题目16 求两个数的最大公约数和最小公倍数

    题目 求两个数的最大公约数和最小公倍数. 最大公约数:指两个或多个整数共有约数中最大的一个 最小公倍数:指两个或多个整数共有倍数中最小的一个 说明:自己没有搞清楚最大公约数和最小公倍数的定义,结果走了 ...

最新文章

  1. 我的C#学习笔记(1)
  2. java动态代理_Java代理模式及动态代理详解
  3. 解决vs2015使用fopen、fprintf等函数报错的问题
  4. 【机器学习】贝叶斯线性回归(最大后验估计+高斯先验)
  5. Dcloud+mui 压缩上传图片到服务器
  6. html5 webrtc fir 请求关键帧_中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址...
  7. hadoop namenode管理元数据机制
  8. 阿里云开源编程马拉松入围项目
  9. laravel queue java_使用 Laravel Queue 不得不明白的知识
  10. 一卡通充值系统c语言,一卡通充值,一卡通充值中心,一卡通充值系统,一卡通充值转账系统 - 新开普(NewCapec)...
  11. 农村淘宝平台农资平台服务费一览
  12. 手机测试SD卡读写速度的软件,手机存储SD卡读写测试:Cross Platfrom Disk Test
  13. 网吧管理员技术资料-转的
  14. 线性代数矩阵行列式_矩阵的行列式 使用Python的线性代数
  15. 《老子》古本学习札记
  16. 华为机密照片!(转载)
  17. 一文带你了解ARM的发展历程
  18. java ldap 父_Java LDAP操作
  19. 内存屏障什么的(经典)
  20. 突发,国内技术问答社区SegmentFault竟然被ONES收购

热门文章

  1. Unreal Engine 4:编译时出现中文乱码问题
  2. 蓝桥杯客观题 单片机知识点总结
  3. 具备以下因素,即为高血压高危人群,测测您患高血压的风险
  4. 能力风暴机器人AS-MF2011循迹算法
  5. webpack 打包并压缩为zip文件
  6. 微信小程序的自学之路一按钮篇
  7. 数字量产工具:输入系统-触摸屏编程
  8. 接红包游戏 html5,游粉H5红包游戏互动,最直接高效的营销方式
  9. Labview XY图实时显示游标数据
  10. 分享两种主流的win10系统重装方法,手把手教你重装win10系统