求最大公约数


求最大公约数

写一段代码,求出两个整数的最大公约数,要尽量优化算法的性能。

辗转相除法, 又名欧几里得算法(Euclidean algorithm),该算法的目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其产生时间可追溯至公元前300年前。

两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2

解题代码:

#include<iostream> 

using namespace std;

int fun(int m,int n){
	return n ? fun(n,m%n) : m ;
}

int main(){
	int a,b;
	cin>>a>>b;	
	cout<<fun(a,b)<<endl;
	return 0;
}

一行代码解决了?太强了本文引用来源:

判断一个数是不是2的整数次幂

2的整数次幂有4、8、16、32等,但是把它们转化为二进制数后减1会1发现所有位都是1.

所以凡是2的整数次幂和它本身减1的结果进行与运算,其结果必然为0!

解题代码:

int main(){
    int a;
    cin>>a;
    if ((a&a-1) == 0)
    	cout<<"yes"<<endl;
    else
    	cout<<"no"<<endl;
	return 0;
}

ps:时间复杂度为O(1)哦!

无序数组排序后最大相邻差

1.利用桶排序的思想,先求出原数组从最小值Min到最大值Max的单位区间长度d,d=(Max-Min)/n-1。算出d的作用是为了后续确定各个桶的区间范围划分。

2.创建一个长度是N+1的数组Array,数组的每一个元素都是一个List,代表一个桶。

3.遍历原数组,把原数组每一个元素插入到新数组Array对应的桶当中,进入各个桶的条件是根据不同的数值区间。由于桶的总数量是N+1,所以至少有一个桶是空的。

4.遍历新数组Array,计算每一个空桶右端非空桶中的最小值,与空桶左端非空桶的最大值的差,数值最大的差即为原数组排序后的相邻最大差值。

public static int getMaxSortedDistance(int[] array) {
        // 1. 获取数组中的最大值和最小值,构建数组的长度
        int max = array[0];
        int min = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
            if (array[i] < min) {
                min = array[i];
            }
        }
        int distance = max - min;
        // 如果max和min相等,说明数组所有元素都相等,返回0
        if (distance == 0) {
            return 0;
        }
        // 2. 初始化桶
        int bucketNum = array.length;
        Bucket[] buckets = new Bucket[bucketNum];
        for (int i = 0; i < bucketNum; i++) {
            buckets[i] = new Bucket();
        }
 
        // 3. 遍历原始数组,确定每个桶的最大最小值
        for (int i = 0; i < array.length; i++) {
            // 确定数组元素所属的桶小标
            int index = ((array[i] - min) * (bucketNum - 1)) / distance;
            if (buckets[index].min == null || buckets[index].min > array[i]) {
                buckets[index].min = array[i];
            }
            if (buckets[index].max == null || buckets[index].max < array[i]) {
                buckets[index].max = array[i];
            }
        }
 
        // 4. 遍历桶,找到最大差值
        // 这里采用临时变量leftMax,在每一轮迭代时存储当前左侧桶的最大值,
        // 而两个桶之间的差值,则是buckets[i].min - leftIndex
        int leftIndex = buckets[0].max;
        int maxDistance = 0;
        for (int i = 1; i < buckets.length; i++) {
            if (buckets[i].min == null) {
                continue;
            }
            if (buckets[i].min - leftIndex > maxDistance) {
                maxDistance = buckets[i].min - leftIndex;
            }
            leftIndex = buckets[i].max;
        }
        return maxDistance;
 
    }
 
    /**
     * 桶
     */
    private static class Bucket{
        Integer min;
        Integer max;
    }
 
public static void main(String[] args) {
 
        int[] array = new int[] {2, 6, 3, 4, 5, 10, 3};
//        int[] array = new int[]{0, 0, 1, 2, 3, 4, 5, 6, 12, 13, 20, 10};
        // 桶排序方式
        int maxSortedDistance = getMaxSortedDistance(array);
        System.out.println("最大相邻差为:"+ maxSortedDistance);
 
    }

文章作者: 冰冰的小屋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冰冰的小屋 !
  目录