当前位置: 首页 > news >正文

C语言之最大公约数和最小公倍数问题

题目描述

输入两个正整数 x0​,y0​,求出满足下列条件的 P,Q 的个数:

  1. P,Q 是正整数。

  2. 要求 P,Q 以 x0​ 为最大公约数,以 y0​ 为最小公倍数。

试求:满足条件的所有可能的 P,Q 的个数。

输入格式

一行两个正整数 x0​,y0​。

输出格式

一行一个数,表示求出满足条件的 P,Q 的个数。

输入

3 60

输出

4

说明/提示

P,Q 有 4 种:

  1. 3,60。
  2. 15,12。
  3. 12,15。
  4. 60,3。

对于 100% 的数据,2≤x0​,y0​≤10^5。

#include<stdio.h> int gcd(int a,int b)//判断最小公倍数 { while(b!=0){ int t=a%b; a=b; b=t; } return a;//a即为最小公倍数 } int main() { int x,y; scanf("%d%d",&x,&y); if(y%x!=0){//最小公倍数一定是最大公约数的倍数,如果不是,则没有解,直接打印出0退出。 printf("0\n"); return 0; } int n=y/x;//最小公倍数的作用只是和最大公因数找出p的范围。 int count=0; int p; for(p=1;p*p<=n;p++){ if(n%p==0){//虽然我们明确n=p*q,但是并不能确定1~sqrt(n)内的数除以p等于q. int q=n/p;//到这一步只是求得了p和q两个因子,但二者不一定是互质的,所以后面还要判断是否互质。只有是互质的才能得出x是最大公因数。 if((gcd(p,q))==1){//判断p和q是否互质 if(p==q){ count++;//说明在计算a和b这两个数的时候得到的a和b是相等的,只有一个结果,所以只需要加1. }else{ count+=2;//说明得到的a和b是不相等的, } } } } printf("%d\n",count); return 0; }

详细解析上述代码逻辑:数学逻辑挺强

1.n=y/x;最大公约数是x,最小公倍数是y,设这两个数为a,b,p和q为去掉最大公约数后,各自独有的部分。而a=x*p,b=x*q.其中p和q是互质的正整数,即二者除了1没有其他公因数。因为p和q还有大于1的公因数,则x就不是最大公约数了。

解析上述:假设有a=12,b=18,他们的最大公约数是6,即x=6。可以写成12=6*2,18=6*3,即a=12=x*p(2),b=18=x*q(3).一般化即为:a=x*p,b=x*q。

为什么p和q必须互质:如果a=40=10*4,b=60=10*6,则p和q不互质,则10不是二者的最大公约数,二者的最大公约数其实是20.所以如果p和q不互质,则x并不是最大公因数。

2.为什么要定义n=y/x:a*b=(x*p)*(x*q)=x^2*p*q,所以a*b/x=x*p*q,即最小公倍数y=a*b/x=x*p*q,所以y/x=p*q.所以令n=y/x,则n=p*q.

定义n=y/x,是因为n通常比y小很多,只需要对n进行因数分解,并检查每对因数是否互质,避免了直接枚举a和b大量结合。

3.实例演示:

假设x=3,y=60.计算n=y/x=60/3=20;

找到所有互质的整数对(p,q)使得p*q=20。20的因数对(1, 20)、(2, 10)、(4, 5)、(5, 4)、(10, 2)、(20, 1)。 其中互质的对是:(1, 20) 和 (4, 5)(注意 (5, 4) 与 (4, 5) 视为同一对的不同顺序,但通常只计算一次,因为 a 和 b 的顺序不影响数对)。对应的 (a, b) 为:(3*1, 3*20) = (3, 60)。(3*4, 3*5) = (12, 15)所以有两组解。(由题意得x=3,p和q互质只有p=1,q=20,所以a=x*p,b=x*q)(这是通过p和q计算的a和b两个数)

4.为什么循环是p*p<=n:我们要通过循环找到所有的(p,q)整数对,使得p*q=n;p和q互质

为什么用 p * p <= n 而不是 p <= n?

思想实验:

假设 n = 100:

· 如果 p = 1,那么 q = 100/1 = 100
· 如果 p = 2,那么 q = 100/2 = 50
· 如果 p = 4,那么 q = 100/4 = 25
· 如果 p = 5,那么 q = 100/5 = 20
· 如果 p = 10,那么 q = 100/10 = 10
· 如果 p = 20,那么 q = 100/20 = 5

由上述可得,当p>sqrt(n)时,相当于p和q又发生交换。我们要得到的p和q其实是p<=sqrt(n)时的值。这样可以减少遍历,因为二者一样的,只需要计数加2即可。

通过上述方法求出来的p和q并不是满足条件的两个数,而是因子,通过这两个因子求得的a和b才是最终的满足条件的两个数,即为下面的:

  1. 3,60。
  2. 15,12。
  3. 12,15。
  4. 60,3。
http://www.gsyq.cn/news/111795.html

相关文章:

  • 【震惊!】护士注册选错机构?这3点必须知道!
  • O(log N) 对数计算
  • 使用Docker快速启动LobeChat镜像的5种方式
  • Detect It Easy原型开发:快速验证你的想法
  • Docker 整体架构
  • Nano Banana Pro:设计师的竞争对手还是强有力的助手?
  • Python | K折交叉验证的参数优化的随机森林RF及SHAP可解释性分析回归预测算法
  • Dsc1103ni5-156.25,低抖动 LVDS 振荡器, 现货库存
  • Windows Subsystem for Linux (WSL) 介绍
  • java计算机毕业设计幸福社区疫苗预约管理系统 乐居家园免疫接种预约平台 安康街道疫苗接种智慧调度系统
  • LobeChat能否支持太空旅行规划?星际航线与生存条件模拟
  • java计算机毕业设计洗衣店信息管理系统 智净连锁门店运营平台 云洗门店业务中枢
  • 【毕业设计】基于JavaWeb的兽医站管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 串口通信基础知识
  • 时间紧,任务重?MCU核心库+示例速览
  • MySQL
  • LMX2581ESQX/NOPB,3.8 GHz 宽带频率合成器, 现货库存
  • Java计算机毕设之基于java+springboot+vue的二手儿童绘本交易系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 【课程设计/毕业设计】基于javaweb的图书管理系统基于javaweb的在线图书借阅管理系统【附源码、数据库、万字文档】
  • ADP2108AUJZ-2.5-R7,峰值效率可达95%的600mA降压转换器, 现货库存
  • 建造者模式-创建型
  • TypedArray 详解
  • 【课程设计/毕业设计】基于Java兽医站管理系统基于JavaWeb的兽医站管理系统的设计与实现【附源码、数据库、万字文档】
  • DNP3.0学习记录
  • kanass全面介绍(12) - 如何自定义事项类型,满足个性化需求
  • 打了一堆板子,才发现是VDD_EXT的锅
  • 28.封装 map set (下)
  • 还买啥USB网卡~直接开启RNDIS就行
  • 2026年EOR名义雇主服务优势TOP8对比榜单,助力全球化布局与用工优化
  • 实用指南:(113页PPT)西门子制造业研发工艺协同平台及制造平台整体规划(附下载方式)