C语言练习题集 - 题4-最大公因数、最小公倍数问题

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
二群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值