求最大公约数及Hankson趣味题

2024-04-08 01:58

本文主要是介绍求最大公约数及Hankson趣味题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、问题说明

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

二、分析

1、基础

用一数组a[]存储输入的N个数,先用gcd()求两个数的最大公约数,然后求a[1]=gcd(a[0],a[1]),再求a[2]=gcd(a[1],a[2]),依次下去,最后a[N-1]既是结果。最小公倍数则调用lcm()。

2、提高

已知
gcd(x,a0)=a1……①
lcm(x,b0)=b1;
根据两个数的最大公约数和最小公倍数的关系,mn/gcd(m,n)=lcm(m,n);
转化得,gcd(x,b0)=x
b0/b1……②
由①②根据最大公约数的性质得,
gcd(x/a1,a0/a1)=1……③
gcd(b1/b0,b1/x)=1……④
符合条件的x必然满足③式和④式,故枚举b1的因子且满足③、④式就是x。
算法流程图
在这里插入图片描述

三、运行结果

1、基础

在这里插入图片描述

2、提高

在这里插入图片描述

四、程序实现

1、N个数的最大公约数

* 名称:第二次作业
* 文件名:基础.cpp
* 说明:多个数的最大公约数及最小公倍数
*/
#include"iostream"
using namespace std;//求最大公约数
int gcd(int a,int b)
{int ans = 1;//储存第一步中约掉的若干个2int gcd;//储存最终返回的结果 while (a % 2 == 0 && b % 2 == 0)//如果a,b均为偶数则用2约简 {a /= 2;b /= 2;ans *= 2;}while (a != b)//判断两数是否相等,相等则得出最大约数{if (a > b)a -= b;//以较大的数减较小的数elseb -= a;//以较大的数减较小的数}gcd = a * ans; //求第一步中约掉的若干个2与第二步中等数的乘积 return gcd;
}//求最小公倍数
int lcm(int a, int b) {return(a*b / gcd(a, b));
}int main() {int a[1000];int temp1, temp2;int i = 0;cin >> i;//输入需要几个数for (int j = 0; j < i; j++) {cin >> a[j];}for (int k = 0; k < i - 1; k++) {temp1 = a[0];temp1 = gcd(temp1, a[k + 1]);}for (int k = 0; k < i - 1; k++) {temp2 = a[0];temp2 = lcm(temp2, a[k + 1]);}int gcd = temp1;cout << "最大公约数 " << temp1 << endl;int lcm = temp2;cout << "最小公倍数 " << temp2 << endl;system("pause");
}

2、Hankson问题

*	名  称:第二次作业
*	文件名:homework2.cpp
*	说  明:Hankson问题实现
*/#include"iostream"
using namespace std;//求最大公约数
int gcd(int a, int b) 
{int ans = 1;//储存第一步中约掉的若干个2int gcd;//储存最终返回的结果 while (a % 2 == 0 && b % 2 == 0)//如果a,b均为偶数则用2约简 {a /= 2;b /= 2;ans *= 2;}while (a != b)//判断两数是否相等,相等则得出最大约数{if (a > b)a -= b;//以较大的数减较小的数elseb -= a;//以较大的数减较小的数}gcd = a * ans; //求第一步中约掉的若干个2与第二步中等数的乘积 return gcd;
}int main() {int n;//n组数据cin >> n;int a0, a1, b0, b1;//正整数a0,a1,b0,b1for (int i = 1; i <= n;i++) {int num = 0;cin >> a0 >> a1 >> b0 >> b1;//	枚举b1的因子,判定条件为j*j<=b1,防止重复记录同一个因子for (int j = 1; j*j <= b1; j++) {if (b1%j == 0) {int x = j;if (x%a1 == 0)//判断最大公约数是否为1if (gcd(x / a1, a0 / a1) == 1 && gcd(b1 / b0, b1 / x) == 1)num++;x = b1 / x;if(x != j && x % a1 == 0)if (gcd(x / a1, a0 / a1) == 1 && gcd(b1 / b0, b1 / x) == 1)num++;}}cout << num << endl;}system("pause");return 0;
}

五、个人总结

数学的学习与算法的设计是紧密结合的,本次作业中核心的就在于对最大公约数的数学知识的充分了解,并且结合计算机的优势,可以不断循环计算。两者结合能够很有效的解决一些问题。

这篇关于求最大公约数及Hankson趣味题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884277

相关文章

js,找出两个数的最大公约数

/*比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1 我们当然也可以把上面这个式子改写成乘法式:a=b*q1+r1     如果r1=0,那么b就是a、b的最大公约数。 要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:b=r1*q2+r2    如果余数r2=0,那么r1就是所求的最大公约数。*/ fun

Python趣味编程

文章目录 系列文章每日十练案例1:打印“Hello, World!”案例2:计算两个数的和案例3:求解输入的数字平方案例4:判断数字的奇偶性案例5:计算阶乘案例6:检查列表中的最大值案例7:列表中的元素求和案例8:反转字符串案例9:字典中的键值对遍历案例10:生成随机数 系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3

趣味定时器

学习完中断后,接下来都是定时中断这一巧妙的中断模式。定时器是在设定时间并且时间一到后就会响应执行设定好的事件,但其只处理一次,如同机械时钟的闹钟功能。而日常中的手机等电子设备设置闹钟后可配置为隔多久再响一次,这需要实现循环定时中断,在下面的内容中会对比说明。 在Linux Kernel中有两种常用的定时器,两者主要是精度的区别,在了解使用它们前,先了解如下几个概念:  1.节拍率(tick r

趣味 | 暴走漫画的《创造1024》

点击上方“朱小厮的博客”,选择“设为星标” 回复”1024“获取独家整理的学习资料 前段时间,暴走漫画出品了一档“综艺”——《创造1024》,视频在网络上疯传,让程序员这个群体火出圈外。 让我们来看看,这个引发圈外人爆笑连连、却让程序员吐槽不止的视频究竟讲了些啥! 首先出场的是鹅厂推送的三人程序员组合,就这样打着吊瓶来了! 台下选手顶着厚重的黑眼圈和凌乱

迭代和递归(Python)--乘方、最大公约数、汉诺塔、斐波那契、回文字符串

1.迭代 def iterPower(base,exp):result=1.0while exp>0:result*=baseexp-=1return result 运行结果: 2.递归的乘法运算: def recurMul(a,b):if b==1:return aelse:return a+recurMul(a,b-1) 运行结果: 3.递归乘方

趣味算法------过河卒

目录 ​编辑 题目描述 解题思路 具体代码 总结 问题描述: 解决方案: 代码实现: 关键点: 题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A 点(0,0)  、B 点(n

趣味算法------拯救阿拉德大陆

目录 ​编辑 题目描述: 思路解析: 具体代码: 总结: 题目描述: 此时一批勇士也随之而来,但其能力也是参差不齐,我们需要挑选出最优秀的勇士来守护这片大陆。每位勇士都有属于自己的编号,而我们现在有四张卡片里面分别标记了一个号码,当勇士的编号为其中某一张卡片中号码的倍数时说明该勇士是优秀的。目前有 n 名勇士(编号 1-n)并且告诉你卡片内的号码,请你计算出能挑选出多

[oeasy]python031_[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics

[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics 🥋 回忆上次内容 上次 动态设置了 断点 断点 可以把代码 切成一段一段的可以 更快地调试 调试的目的 是 去除 bug 别害怕 bug 一步步 总能找到 bug这 就是 程序员基本功 调试 debug 在bug出现的时候 甚至还没有出现操作系统 那操作系统 是怎么开始有的呢??🤔 出

趣味算法------回文数

目录 ​编辑 前言         什么是回文数 题目描述 解题思路 具体代码 C语言代码 python代码 总结 ps 前言         什么是回文数                          回文数(Palindrome Number)是一种特殊的数字,它正读和反读都是一样的。例如,121,12321,111,和0都是回文数,而12

趣味算法------尾部零的个数(C语言,python双重解法)

目录 题目描述: 解题思路: 具体代码: 注意: 题目描述: 给出数字 n(0<n<1000000),计算出 n 阶乘尾部零的个数。 输入输出格式 输入格式 一个整数。 输出格式 一个整数。 输入输出样例 输入 11 输出 2 说明/提示 11! = 39916800,结尾的 0 有 2 个。 解题思路:         我们以输