常用函数实现
求最大公约数
int gcd(int a, int b) { if (a == 0 || b == 0) return 0; int tmp = 0; while (b != 0) { tmp = b; b = a%b; a = tmp; } return a; }
交换swap
template <class T> void swap(T &a, T &b) { T c(std::move(a)); a = std::move(b); b = std::move(c); }
a = a ^ b; b = a ^ b; a = a ^ b;
求某个区间随机数
int RandomlnRange() { if (start > end) return -1; return rand() % (end - start + 1) + start; }
分割数组Partition
int Partition_v1(vector<int>& num, int low, int high) { int pivot = num[low]; while (low < high) { while (low < high && num[high] >= pivot) --high; num[low] = num[high]; while (low < high && num[low] <= pivot) ++low; num[high] = num[low]; } num[low] = pivot; return low; }
分解质因数(面试题考过)
void Analyse(int n) { //打印出 int i; for (i = 2; i <= sqrt(static_cast<double>(n)); i++) { if (n % i == 0) { n = n / i; cout << i << "*"; i--; } } cout << n << endl; }
不用加号计算两数和
int add(int a, int b) { if (b == 0) return a; int sum = a^b; int carry = (a&b) << 1; return add(sum, carry); }
strcpy
char *strcpy(char *strDest, const char *strSrc) { assert(strDest != NULL && strSrc != NULL); char *address = strDest; while ((*strDest++ = *strSrc++) != '\0'); return address; }
二分查找
1 #include <iostream> 2 3 using namespace std; 4 5 /* 6 *二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid 7 查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。 8 9 输入:排序数组-array,数组大小-aSize,查找值-key 10 返回:返回数组中的相应位置,否则返回-1 11 */ 12 //非递归查找 13 int BinarySearch(int *array, int aSize, int key) 14 { 15 if ( array == NULL || aSize == 0 ) 16 return -1; 17 int low = 0; 18 int high = aSize - 1; 19 int mid = 0; 20 21 while ( low <= high ) 22 { 23 mid = (low + high )/2; 24 25 if ( array[mid] < key) 26 low = mid + 1; 27 else if ( array[mid] > key ) 28 high = mid - 1; 29 else 30 return mid; 31 } 32 return -1; 33 } 34 //递归 35 int BinarySearchRecursive(int *array, int low, int high, int key) 36 { 37 if ( low > high ) 38 return -1; 39 int mid = ( low + high )/2; 40 41 if ( array[mid] == key ) 42 return mid; 43 else if ( array[mid] < key ) 44 return BinarySearchRecursive(array, mid+1, high, key); 45 else 46 return BinarySearchRecursive(array, low, mid-1, key); 47 } 48 49 int main() 50 { 51 int array[10]; 52 for (int i=0; i<10; i++) 53 array[i] = i; 54 55 cout<<"No recursive:"<<endl; 56 cout<<"position:"<<BinarySearch(array, 10, 6)<<endl; 57 cout<<"recursive:"<<endl; 58 cout<<"position:"<<BinarySearchRecursive(array, 0, 9, 6)<<endl; 59 60 return 0; 61 }