一步一步写算法(之 最大公约数、最小公倍数)

简介: 原文: 一步一步写算法(之 最大公约数、最小公倍数) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目。
原文: 一步一步写算法(之 最大公约数、最小公倍数)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目。从题面上看,好像我们需要求解的是两个题目,但其实就是一个题目。那就是求最大公约数?为什么呢?我们可以假想这两个数m和n,假设m和n的最大公约数是a。那么我们可以这样写:

    m = b *a;

    n = c * a;

    所以m和n的最小公倍数就应该是a*b*c啊,那不就是m * n / a,其中m和n是已知的,而a就是那个需要求解的最大公约数。所以就有了下面的代码,

int GetMinCommonMultiple(int m, int n)
{
	assert(m && n);

	return m * n / GetMaxCommonDivide(m, n);
}
    下面就可以开始最大公约数的求解。其实,关于最大公约数的求解,大家看到的更多是各种捷径,比如说 欧几里得法。欧几里得法构思十分巧妙,它利用了m、n和n、m%n之间的最大公约数是相等的这一重要条件,充分利用替换的方法,在 m%n等于0的那一刹那,获得我们的最大公约数。然而,我们平时自己所能想到的方法却不多,下面的方法就是具有典型意义的一种:

    a) 首先对数据m和n判断大小,小的赋值给smaller,大的赋值给larger

    b)index索引从2开始到smaller遍历,发现有没有数据可以同时被两者整除,有则更新数据

    c)循环结束后,获取最大的公约数

int GetMaxCommonDivide(int n, int m)
{
	int index;
	int smaller;
	int larger;
	int value;
	assert(n && m);

	if(n > m){
		larger = n;
		smaller = m;
	}else{
		larger = m;
		smaller = n;
	}

	value = 1;
	for(index = 2; index <= smaller; index++){
		if(0 == (smaller % index) && 0 == (larger % index))
			value = index;
	}

	return value;
}
    上面的代码看似没有问题,但是还是留下了一个遗憾,如果m和n的数据都大于32位,那怎么办?也许有的朋友会说,现在有64位的cpu。但是如果我们此刻没有64位的cpu,那该怎么办呢?


总结:

    (1)看似最大公约数、最小公倍数是个小问题,但是要写好不容易,算法、参数判断、逻辑都要注意,

    (2)如果m和n的数据都比较大,有没有可能利用多核降低计算的复杂度,

    (3)如果m和n中有数据大于32位,那该怎么办?

    (4)小问题看似简单,但是在不同的场景下却可以变得非常复杂,作为面试题可以充分考察面试者的沟通能力和应变能力。



目录
相关文章
|
3月前
|
算法
求最大公约数和最小公倍数的算法
求最大公约数和最小公倍数的算法
25 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
17 0
|
3月前
|
算法 Python
最大公约数算法
最大公约数算法
|
3月前
|
算法 Python
最小公倍数算法
最小公倍数算法
|
10月前
|
算法
算法训练之最大最小公倍数 ALGO002
算法训练之最大最小公倍数 ALGO002
29 0
|
10月前
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
48 0
|
11月前
|
算法 C++
每日算法系列【LeetCode 1363】形成三的最大倍数
每日算法系列【LeetCode 1363】形成三的最大倍数
算法--递归辗转相除法求最大公约数
算法--递归辗转相除法求最大公约数
|
算法
求最大公约数和最小公倍数的几种算法
求最大公约数和最小公倍数的几种算法
88 0
|
算法 C语言
【C语言初阶】求两个数的最大公约数,三种算法
给定两个整数,让你求这两个数的最大公约数 最大公约数顾名思义就是:这几个整数共有的约数中最大的一个。
119 0