C语言练习题集 - 题3-最大公因数、最小公倍数问题(1)
题目:
输入两个正整数, m 和 n ,求其最大公约数和最小公倍数
用最通俗的手法入门编程!再拾阶而上!
写在最前:
1.最大公约数:
(1)分解质因数法
(2)辗转相除法
(3)更相减损术
2.最小公倍数:
(1)分解质因数法
(2)公式法
以上将是会用到的方法(当然也是走一步看一步,如果某一步做不来了估计就会把那一步“割掉”)
一、最大公约数:
1.辗转相除法:
(1)原理透析:
比如输入整数 300 和 212 ,则:
第一步:300 % 212 = 1 余 88 ;
第二步:212 % 88 = 2 余 36 ;
第三步:88 % 36 = 2 余 16 ;
第四步:36 % 16 = 2 余 4 ;
第五步:16 % 4 = 0 余 0 ;
因此,300 和 212 的最大公约数是4;
(2)代码实现:
//1. 输入两个正整数, m 和 n ,求其最大公约数和最小公倍数。
#include <stdio.h>
void method_1(const int a,const int b);
int main(void)
{
int a = 0.0, b = 0.0;
puts("Please enter two positive integers:(separate with space)");
scanf("%d %d",&a,&b);
//method #1: 辗转相除法:
method_1(a,b);
return 0;
}
void method_1(const int a, const int b)
{
int m_a = a, m_b = b,min = 0,mid=0,j=0,max=0; //mid用于判断是否求到最后一步余数=0的情况
if (m_a < m_b)
{
min = a;
max = b;
}
else {
min = b;
max = a;
}
do
{
mid = max % min;
max = min;
if (mid != 0)
{
min = mid;
}
} while (mid != 0);
printf("最大公因数为: %d \n", min);
}
(3)结果:
2.分解质因数法
(1)原理透析:
如求32和22的最大公因数:
32 = 2 × 2 × 2 × 2 × 2 ;
22 = 2 × 11;
它们只有一个相同的数字2,因此它们的最大公因数就是2;
又如:
56和48:
56 = 2 × 2 × 2 × 7;
48 = 2 × 2 × 2 × 2 × 3;
它们的共同数字有: 2 2 2 ;
因此,它们的最大公因数就是 2 × 2 × 2 = 8;(正在更新…)
(2)代码实现:
//1. 输入两个正整数, m 和 n ,求其最大公约数和最小公倍数。
#include <stdio.h>
void method_1(const int a,const int b);
void method_2(const int a, const int b);
int main(void)
{
int a = 0, b = 0;
puts("Please enter two positive integers:(separate with space)");
scanf("%d %d",&a,&b);
//method #1: 辗转相除法:
//method_1(a,b);
//method #2: 分解质因数法
method_2(a, b);
return 0;
}
void method_2(const int a, const int b)
{
int m_a = a, m_b = b, result = 1, i = 2;
int judge = 1; //判断循环结束
if (m_a > m_b)
{
while (judge != 0)
{
if (m_a > 0 && m_b > 0)
{
if ((m_a % i == 0) && (m_b % i == 0))
{
result *= i;
m_a /= i;
m_b /= i;
i++;
if (i > m_a || i > m_b)
judge = 0;
}
else {
i++;
if (i > m_a || i > m_b)
judge = 0;
}
}
else judge = 0;
}
printf("Result : %d\n", result);
judge = 1;
}
}
(3)运行结果:
3.更相减损术
(1)原理透析:
摘自百度百科的步骤:
- 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
- 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
- 第三步:第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。
来个例子就明白了:
如求 62 和 36 的最大公因数:
62 - 36 = 26 ;
36 - 26 = 10 ;
26 - 10 = 16 ;
16 - 10 = 6;
10 - 6 = 4 ;
6 - 4 = 2 ;
4 - 2 = 2;
因此 62 和 36 的最大公因数为2;
要验证也容易,使用上一个程序即可得:
没问题,接下来就是代码的实现了:
//1. 输入两个正整数, m 和 n ,求其最大公约数和最小公倍数。
#include <stdio.h>
void method_1(const int a,const int b);
void method_2(const int a, const int b);
void method_3(const int a, const int b);
int main(void)
{
int a = 0, b = 0;
puts("Please enter two positive integers:(separate with space)");
scanf("%d %d",&a,&b);
//method #1: 辗转相除法:
//method_1(a,b);
//method #2: 分解质因数法:
//method_2(a, b);
//method #3: 更相减损术:
method_3(a, b);
return 0;
}
void method_3(const int a, const int b)
{
int m_a = a, m_b = b,mid = 0,max=0 ,min=0;
if (m_a> m_b)
{
max = m_a;
min = m_b;
}
else { max = m_b; min = m_a; }
while (1)
{
mid = max - min;
if (mid == min)
{
break;
}
if (min>mid)
{
max = min;
min = mid;
}
else
{
max = mid;
}
//防止使用者骚操作给整成死循环:
if (max <= 0 || min <= 0)
{
break;
}
}
printf("Result : %d\n", mid);
}
(3)运行结果:
二、最小公倍数
1.分解质因数法
(1)原理透析:
直接上例子:
如求 56 和 48 的最小公因数:
56 的因数有: 2 2 2 7
48 的因数有: 2 2 2 2 3
公因数有:2 2 2,最大公因数为 2× 2 × 2 = 8;
在除以最大公因数后,56 / 8 =7;48 / 8 = 6;
因此其最小公倍数为:8 × 7 × 6 = 336;
通过上述例子可以发现,第一步仍然是先找出最大公因数,接着再用各数除以最大公倍数后的值的乘积乘以最大公因数即可。
又如:
24 = 2 × 2 × 2 × 3
36 = 2 × 2 × 3 × 3
最小公倍数 = 12(最大公因数) × 2 × 3 = 72;
(2)代码实现:
//1. 输入两个正整数, m 和 n ,求其最大公约数和最小公倍数。
#include <stdio.h>
void method_1(const int a,const int b);
void method_2(const int a, const int b);
void method_3(const int a, const int b);
void method_a1(const int a, const int b);
int main(void)
{
int a = 0, b = 0;
puts("Please enter two positive integers:(separate with space)");
scanf("%d %d",&a,&b);
//method #1: 辗转相除法:
//method_1(a,b);
//method #2: 分解质因数法:
//method_2(a, b);
//method #3: 更相减损术:
//method_3(a, b);
//method #1:分解质因数法求最小公倍数:
method_a1(a, b);
return 0;
}
void method_a1(const int a, const int b)
{
int m_a = a, m_b = b,max = 0 , min = 0, mid = 0,temp1=0 ,temp2=0,final = 0;
//step 1: 找最大公因数:
if (m_a > m_b )
{
max = m_a;
min = m_b;
}
else { max = m_b; min = m_a; }
while (1)
{
mid = max - min;
if (mid >min)
{
max = mid;
}
else
{
max = min;
min = mid;
}
if (mid == min)
{
break;
}
}
//最大公因数为mid;
//Step 2:求最小公倍数:
temp1 = m_a / mid;
temp2 = m_b / mid;
final = temp1 * temp2 * mid;
printf("Result: %d\n", final);
}
(3)运行结果:
2.公式法:
(1)原理透析:
a与b的乘积 = a与b的最大公因数 × a与b的最小公倍数;
如:
36 和 16 的最小公倍数,因为36 和16的最大公因数是4,所以其最小公倍数为:
36 × 16 ÷ 4 = 144;
(2)代码实现:
//1. 输入两个正整数, m 和 n ,求其最大公约数和最小公倍数。
#include <stdio.h>
void method_1(const int a,const int b);
void method_2(const int a, const int b);
void method_3(const int a, const int b);
void method_a1(const int a, const int b);
void method_a2(const int a, const int b);
int main(void)
{
int a = 0, b = 0;
puts("Please enter two positive integers:(separate with space)");
scanf("%d %d",&a,&b);
//method #1: 辗转相除法:
//method_1(a,b);
//method #2: 分解质因数法:
//method_2(a, b);
//method #3: 更相减损术:
//method_3(a, b);
//method #1:分解质因数法求最小公倍数:
//method_a1(a, b);
//method #2:公式法求解最小公倍数:
method_a2(a, b);
return 0;
}
void method_a2(const int a, const int b)
{
int m_a = a, m_b = b, max = 0, min = 0, mid = 0, final = 0;
//step 1: 找最大公因数:
if (m_a > m_b)
{
max = m_a;
min = m_b;
}
else { max = m_b; min = m_a; }
while (1)
{
mid = max - min;
if (mid > min)
{
max = mid;
}
else
{
max = min;
min = mid;
}
if (mid == min)
{
break;
}
}
//最大公因数为mid;
final = m_a * m_b / mid;
printf("Result: %d\n", final);
}
(3)运行结果:
这道题原理简单,但实际上真要想做出来对新手来说也还是有一定的挑战。
觉得可以的话一定要点个赞呀~~~
由简入深,祝你成功!ღ( ´・ᴗ・` )比心
我们的QQ群号:②群:905592124