基础回顾--STL unique, bound, 最大公因数

unique

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int a[] = { 1, 3, 3, 3, 5, 6, 0, 0, 8, 7, 8};
int main() {

    // unique(iter1, iter2),左闭右开,返回的是去重之后的 “尾地址” --> 是指针
    // 注意与原数组的尾地址不同
    // 原数组的大小并没有改变
    // unique函数只是把重复的元素放到了原数组的后方
    // 去重是指连续的重复元素
    // 所以常常将数组排好序之后再去重,这样可以去掉所有的而重复元素
    int sz = unique(a, a + sizeof(a)/sizeof(int)) - a;
    for(int i=0; i< sz; ++i) {
        cout << a[i] << ' ';
    }cout << endl;
    cout << sz << endl;
    return 0;
}

 

bound

/*
lower_bound 和 upper_bound 的原理都是二分查找,效率很高
返回"第一个"满足条件的元素的地址:
    注意区间都是"左闭右开"!
    upper_bound(begin, end, num) -- 第一个严格大于num
    lower_bound(begin, end, num) -- 第一个小于等于num
    可通过减去首地址得到该元素的下标
查找失败时返回end()
一般在排好序之后使用
*/
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int a[] = { 1, 2, 7, 3, 15, 34};
    sort(a, a+sizeof(a)/sizeof(int));
    int pos = lower_bound(a, a+sizeof(a)/sizeof(int), 7) - a;
    cout << a[pos] << endl;

    pos = upper_bound(a, a+sizeof(a)/sizeof(int), 7) - a;
    cout << a[pos] << endl;
    return 0;
}

 

gcd

/*辗转相除 && 更相减损*/
#include <cstdio>
#include <iostream>
using namespace std;

// 更相减损, 注意前提条件a >= b
/*
举个例子来理解:
    假设球两个数161和63的最大公约数,设解为m
    可以将较大的161看作63+98, 因为63可以整除m--所以98也必定能够整除m
    问题转换为求63和98的最大公约数

    此时98可以看作63+35-->转换为求63和35的最大公约数
    …………
    最后转化为求7和7的最大公约数
*/
int f(int a, int b) {
    if(a < b) swap(a, b);
    int r = a-b;
    if(r == 0) return a;
    if(r > b) return f(r, b);
    else return f(b, r);
}

//求解a,b的最大公因数
//辗转相除:其实时更相减损的变式
/*
在上边的更相减损的演示过程中可以发现
求a与b(a>b)的最大公因数就是不断地减b,直至无法相减
-->等价于a%b得到最后的余数
-->这样就可以将更相减损优化成辗转相除
*/
//递归版本
int gcd_recursion(int a, int b) {
    if(a < b) swap(a, b);
    return (b==0)? a:gcd_recursion(b, a%b);
}
//循环版本
int gcd_loop(int a, int b) {
    if(a < b) swap(a, b);
    int r;
    while(b !=0) {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}
int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("gcd = %d %d %d\n", gcd_loop(a, b), gcd_recursion(a, b), f(a, b));
    return 0;
}
posted @ 2019-08-25 09:28  Bankarian  阅读(232)  评论(0编辑  收藏  举报