这是在洛谷刷到的一个题,我觉得初学者可以试试这个题,现在我想说一下我的思路。这个我们要对于最大公约数与最小公倍数有一定的了解。之前了解一下最大公约数的求法,就是我们所说的辗转相除法。先介绍一下辗转相除法吧:就以其中一个测试用例为例,求15,12的最大公约数。

这就是辗转相除法的大概。再来看一个例子:

假如需要求 1997 和 615 两个正整数的最大公约数,用辗转相除法,是这样进行的:

1997 / 615 = 3 (余 152)

615 / 152 = 4(余7)

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

至此,最大公约数为1

看完这两个例子,我们来仔细了解一下这个算法。

辗转相除法求最大公约数,我们就先让两个数相除然后进行取余。由图得z=x%y。然后我们让x=y;y=z;z=x%y。当z=0是就是我们辗转相除的结束,此时最大公约数就是此时的y。

while(a%b!=0){z=x%y;x=y;y=z;}

这就是辗转相除法的循环实现。

再来看一看辗转相除法的递归实现。首先递归出口我们设为x%y==0时,这样直接返回y即可。否则的话,我们把y交给x,把x%y交给y,进行递归。看上面的图解应该可以写出这个递归推导式。

int zhanzhuan(int x,int y){if(x%y==0){return y;}else{return zhanzhuan(y,x%y);}
}

这就是递归的实现。

解决了最小公约数的问题,我们回到这个题。我们把这个问题分为两半处理,这样可以提高我们代码执行效率。因为四个答案是两个乘数的换位,所以,我们只需要寻找一半即可,在

x->sqrt(x*y)这个范围内,寻找即可。每次让x++,y就是输入两个数的积除以x(y需要是整数,否则此循环直接跳过即可,可以用逻辑运算实现这一步),然后我们只需要判断此时的xy是不是以最初的x为最小公约数即可,我们用函数递归处理得到最小公约数,与最初的x进行比较,只要相等我们让计数器++即可。

最后还需注意x,y如果相等也就是x=y=sqrt(最初的x*y)。这个时候两个乘数反转时答案是一样的,我们需要在答案中剔除这个相同的值。

最后上一下ac代码

#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;long long int yueshu(int x,int y){if(x%y==0){return y;}else{return yueshu(y,x%y);}
}int main(){int x,y;cin>>x>>y;int t=x;int flag=0;long long int ret=x*y;int count=0;while(x<=(long long int)(sqrt(ret))){if(yueshu(x,ret/x)==t&&(ret)%x==0){count++;long long int m=x*x;if(m==ret){flag=1;}}x++;}cout<<count*2-flag;return 0;
}

如果还有问题欢迎留言询问。

[NOIP2001 普及组] 最大公约数和最小公倍数题解相关推荐

  1. P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题(2022.02.02) --- python3实现

    [NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷 """P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题(2022.02.02) h ...

  2. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  3. P1028 [NOIP2001 普及组] 数的计算 python

    https://www.luogu.com.cn/problem/P1028 """ P1028 [NOIP2001 普及组] 数的计算 https://www.luog ...

  4. 【洛谷 P1046】[NOIP2005 普及组] 陶陶摘苹果 题解(比较)

    [NOIP2005 普及组] 陶陶摘苹果 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10 个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个 30 30 30 厘米高的 ...

  5. c语言普及组复赛题目大全,NOIP 2016普及组复赛C/C++详细题解报告

    第1题 这题很简单,唯一需要注意的是需要判断能不能整除.#include #include #include using namespace std;int main(){ freopen(" ...

  6. c++求先序排列 [NOIP2001 普及组]

    给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度 len≤8). 输入格式 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输出格式 11行 ...

  7. NOIP 2016普及组复赛C/C++详细题解报告

    第1题 这题很简单,唯一需要注意的是需要判断能不能整除. #include <iostream> #include <climits> #include <cstdio& ...

  8. CSP-J (NOIP普及组) 历年复赛真题考察内容(1998~2021)

    TZOJ题目分类 本博客原文地址:https://www.cnblogs.com/BobHuang/p/14522022.html 其中,1.较简单题26题左右:2.动态规划17题,其中9题较好做:3 ...

  9. NOIP普及组历届真题(1997~2018)

    供大家刷题. 先上快捷的查看方式:NOIP普及组历届真题 第二页 来自洛谷--一个很好的刷题网站 剩下是具体题目和难度以及是第几年的题. P1002 过河卒 NOIp普及组 2002 普及- P100 ...

最新文章

  1. linux内核设备管理典型算法,linux内核物理存储空间管理有哪些常用算法
  2. ROR与社区网站开发
  3. [转] - 如何用QTcpSocket传送图片
  4. K - FatMouse and Cheese
  5. collection集合 地址_java.util包下的集合
  6. 硬核黑科技、技术大咖、AI 音乐节……科大讯飞全球 1024 开发者节太燃了!
  7. 多学一点(十三)——解决Linux kdump服务启动失败
  8. 在VS2010中使用Git管理源代码
  9. RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用
  10. 计算机d盘无法格式化,四种方法解决D盘无法格式化问题
  11. No binary rubies available for: osx/10.15/x86_64/ruby-2.6.3. Continuing with compilation.
  12. IR2104与IR2103区别
  13. socket closed
  14. 1189 SEARCH
  15. GNU C++ 智能指针3-- 解析_Sp_counted_base类
  16. PS之画笔无法覆盖前一个颜色
  17. c# 中文数字转阿拉伯数字
  18. 视频教程-OpenGL入门2019版-其他
  19. Windows平台如何快速打开体积大的txt等文本文件
  20. Google公益广告的答案

热门文章

  1. 【2022】较为全面的AlexNet总结
  2. chp2-2-2_fmm_word_seg通过最大正向匹配算法对句子进行切分
  3. 怎样用Java求水仙花数和水仙花数的数量
  4. html页面导出pdf截断问题,利用wkhtmltopdf(thead)将网页导出为pdf方法;以及存在表格图片被分页打断的问题解决方法...
  5. 1-给出n阶方阵里所有数,求方阵里所有数的和(华为机试)
  6. WS小世界网络构建实验(Matlab版)
  7. Mysql - 知识图谱总览
  8. [转]阿里云 内置算法和模板说明
  9. java.sql.SQLException: Table 'test.customer' doesn't exist Query: Select id,name,address,phone from
  10. 情绪识别软件?论程序员对猫的偏爱!