- 在学习C语言的过程中,会遇到很多很经典的代码,
- 今天给大家分享我在刷题过程中遇到的经典题目,
- 注:以下题目均来自牛客网,
- 如果你是刚入门C语言又找不到题库练手感的,
- 我非常推荐你去牛客网刷题
1.小乐乐和欧几里得
1.1 描述
- 小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
1.2 输入描述
- 每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109),
1.3 输出描述
- 对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。
1.4示例
1.5 思路
- 根据题目要求就是计算两个数的最大公约数和最小公倍数的和
- 那我们可以先分别计算出最大公约数和最小公倍数,再将两数相加即可
- 最大公约数,首先想到的就是遍历从2到两个数中较小数,然后用两个数逐除,看能不能除尽,
- 最小公倍数,也是从最大数开始一直往后遍历,知道这个数能同时被两数除尽
- 代码如下
#include <stdio.h>
int main()
{
long long n,m; //考虑到这里的n和m可能很大,所以使用long long来定义
scanf("%lld %lld",&n,&m);
long long max = n>m?m:n;//假设n和m的较小值为最大公约数
while( 1 )
{
if( n%max==0 && m%max==0)
{
break;
}
max--;
}//此时max里面记录的就是最大公约数
//最小公倍数
long long min = n>m?n:m; //假设n和m的较大值为最小公倍数
while(1)
{
if( min%n==0 && min%m==0 )
{
break;
}
min++;
}
printf("%lld",min+max);
return 0;
}
- 这种暴力求解的思路只在两数比较小的时候好用,但是当两个数都很大的时候,算法的复杂度就很大了
- 很不巧,当你使用这个方法的时候,这里过不了检测
- 既然暴力解法不行,那就只能借助古人的智慧了——>辗转相除法求最大公因数
- 具体做法如下,可参考辗转相除法
- 最大公因数求出来了,那么最小公倍数就是两数相乘之后再除最大公因数即可
- 具体代码实现如下:
#include <stdio.h>
int main()
{
long long n,m;
scanf("%lld %lld",&n,&m);
//求最大公约数
long long max = 0;
long long min = 0;
long long tmp = 0;
//先将n和m进行保存,防止下面使用辗转相除的方法影响n和m的值
long long a = n;
long long b = m;
//辗转相除法
while(tmp=n%m)
{
n = m;
m = tmp;
}
max = m;
//最小公倍数=n*m/max
min = a*b/max;
printf("%lld",min+max);
return 0;
}
- 这样就完成这道题目了
- 这道题目虽然是属于简单题,但是通过率却很低,
- 可见这道题难度还是有的。
最后,
如果上述代码或表述有问题,
欢迎一起交流