news 2026/2/6 17:50:54

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 14:36:56

Linux线程操作全指南

Linux线程概述与操作指南线程与进程对比线程是轻量级进程&#xff0c;属于某个进程&#xff0c;共享进程资源但拥有独立栈区&#xff08;默认8MB&#xff09;。进程资源独立&#xff0c;稳定性更高&#xff1b;线程崩溃可能导致整个进程崩溃。线程创建开销更小&#xff08;仅需…

作者头像 李华
网站建设 2026/2/6 12:10:15

传统VS智能:DBC文件处理效率对比实验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个DBC文件处理效率对比工具。工具应能&#xff1a;1) 自动生成测试用DBC文件 2) 提供传统手动解析方法 3) 实现AI自动解析方法 4) 记录并对比两种方法的处理时间和准确性。输…

作者头像 李华
网站建设 2026/2/3 7:34:57

LobeChat能否支持生物识别?人脸/声纹/步态特征分析应用

LobeChat能否支持生物识别&#xff1f;人脸/声纹/步态特征分析应用 在智能设备日益渗透日常生活的今天&#xff0c;用户对AI助手的期待早已超越“能聊天”的基础功能。我们希望它认识我、理解我&#xff0c;甚至在我开口之前就知道我想做什么——这种“感知型交互”正成为下一代…

作者头像 李华
网站建设 2026/2/3 8:53:43

Miniconda实现Python多版本灵活切换

Miniconda 实现 Python 多版本灵活切换 在机器学习和科学计算的日常开发中&#xff0c;你是否也曾陷入这样的“环境地狱”&#xff1f;&#x1f631; “这个项目用 PyTorch 1.13&#xff0c;必须 Python 3.9&#xff0c;但我的系统是 3.11。”“同事跑通的代码&#xff0c;我一…

作者头像 李华
网站建设 2026/2/6 14:14:47

场馆预约小程序开发:解锁 “预约经济” 的高效解决方案

在数字化转型加速的背景下&#xff0c;场馆预约需求已渗透体育、办公、教育、文旅等多个领域。传统线下预约模式存在 “信息不透明、操作繁琐、管理低效” 等痛点&#xff0c;而小程序凭借 “轻量化、高触达、易操作” 的优势&#xff0c;成为场馆预约场景的理想载体。本文从核…

作者头像 李华
网站建设 2026/1/31 15:04:09

Product Hunt 每日热榜 | 2025-12-16

1. Unloop 标语&#xff1a;为注意力缺陷多动症&#xff08;ADHD&#xff09;和神经多样性思维者设计的视觉模式映射 介绍&#xff1a;Unloop 是一款可视化的模式映射工具&#xff0c;帮助你识别那些让你感到陷入困境的触发因素、想法、情绪和行为。把这些内容可视化&#xf…

作者头像 李华