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; }