求在1~N中任意选择3个数,求它们最大的最小公倍数

本文解析了一道蓝桥杯竞赛中的数论题目,该题要求在1到N的范围内找出三个数,使得这三个数的最小公倍数尽可能大。文章通过分析得出结论,并给出了具体的实现代码。

今天在做蓝桥杯练习时遇到一道题,觉得题很新颖,所以写下来便于整理。题的内容是输入一个数N,在1~N内任意选择三个数,求这三个数的最小公倍数最大可以是多少。首先注意是“可以是多少”,他要求的范围是N个数内。根据往常的思维我们很容易想到,三个数互质时最小的公倍数最大。因此这里我们只需分类讨论两种情况即可。

(1)奇数-偶数-奇数,此时很显然,三个连续的数若为此情况,三个都是互质的,则此时最大的最小公倍数即为n*(n-1)*(n-2);

(2)偶数-奇数-偶数,此时因为存在两个偶数,二者存在公因数2,最小公倍数会除以2,这样不能保证最大(由于后面的方法只需将数前后移动1-2位,因此除以2的方法明显会大幅减小最小公倍数),因此可以先将后面的偶数减1,得n-3,此时需要考虑n是否为3的倍数,因为若为3的倍数,明显会与n-3有公因数3,这样的情况更不可,所以n若不为3的倍数,最大的最小公倍数则为n*(n-1)*(n-3),若为3的倍数,最大的最小公倍数为(n-1)*(n-2)*(n-3).代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(){
long long int n,t;
scanf("%I64d",&n);
if(n<=2){
t = n;
}
else if(n%2!=0){
t = n*(n-1)*(n-2);
}
else{
if(n%3==0){
t = (n-1)*(n-2)*(n-3);

else{
t = n*(n-1)*(n-3);
}
}
printf("%I64d",t);
return 0;
}

### C语言实现两个整数的最大公约数和最小公倍数 以下是通过C语言实现解两个整数最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)的代码示例: #### 方法一:基于辗转相除法 此方法利用欧几里得算法来高效计算最大公约数,随后根据两数乘积等于其最大公约数与最小公倍数之积的关系得出最小公倍数。 ```c #include <stdio.h> // 函数:最大公约数 int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } // 函数:最小公倍数 int lcm(int a, int b) { return (a / gcd(a, b)) * b; // 防止溢出先做除法再乘法 } int main() { int num1, num2; printf("请输入两个整数:"); scanf("%d %d", &num1, &num2); if (num1 == 0 || num2 == 0) { printf("其中一个数为零时无法计算最小公倍数。\n"); } else { printf("最大公约数是:%d\n", gcd(num1, num2)); printf("最小公倍数是:%d\n", lcm(num1, num2)); } return 0; } ``` 这种方法的时间复杂度较低,适合处理较大数值的情况[^1]。 --- #### 方法二:穷举法 该方法通过对较小值范围内的所有可能因子逐一验证的方式找出最大公约数;而对于最小公倍数,则从较大值开始逐步尝试直到找到符合条件的结果为止。 ```c #include <stdio.h> // 穷举实现最大公约数 int gcd(int a, int b){ int max = 1; // 假设初始最大公约数为1 for(int i = 1; i <= (a<b?b:a); ++i){ if((a % i == 0) && (b % i == 0)){ max = i; } } return max; } // 穷举实现最小公倍数 int lcm(int a, int b){ int multiple = (a > b)? a : b; while(1){ if(multiple % a == 0 && multiple % b == 0){ break; } multiple++; } return multiple; } int main(){ int a, b; printf("请输入a,b的值:"); scanf("%d %d", &a, &b); printf("最大公约数为:%d\n", gcd(a, b)); printf("最小公倍数为:%d\n", lcm(a, b)); return 0; } ``` 尽管简单易懂,但效率相对较低,尤其当输入数据量级增大时表现不佳[^2]。 --- #### 关键点解析 - **最大公约数** 的核心在于寻找可以同时整除给定两数的最大正整数。 - **最小公倍数** 则需满足能被这两个数分别整除的同时达到最小化的要。 - 上述两种方法均提供了有效途径解决这一问题,具体选用取决于实际需以及性能考量因素。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值