您的位置:首页 > 编程语言 > Go语言

Binary Search and Euclid Algorithm

2017-12-29 14:18 399 查看
#include<iostream>
using namespace std;

/*

Performs the standard binary search using two comparisons per level.

Returns index where item is found or -1 if not found.

*/

const int NOT_FOUND = -1;

template<typename Comparable>

int binarySearch(const vector<Comparable>&a, const Comparable&x)

{

 int low = 0, high = a.size() - 1;
 while (low <= high)

 {

  int mid = (low + high) / 2;
  if (a[mid] < x)

  {

   low = mid + 1;

  }

  else if (a[mid] > x)

  {

   high = mid - 1;

  }

  else

  {

   return mid;  //found

  }

 }
 return NOT_FOUND;

}
/*

Euclid's Algorithm

Euclid's Algorithm for computing the greatest common divisor

*/
long long gcd(long long m, long long n)

{

 while (n != 0)

 {

  long long rem = m%n;

  m = n;

  n = rem;

 }

 return m;

}

欧几里得算法的思想

欧几里得算法的思想基于辗转相除法的原理,辗转相除法是欧几里得算法的核心思想,欧几里得算法说白了其实就是辗转相除法的计算机算法的事项而已。如果gcd(a,b)来表示a和b的最大公约数,那么根据辗转相除法的原理,有gcd(a,b)=gcd(b,a mod(b)),其中mod()表示模运算,并且不妨让a》b这样方便模运算。

辗转相除法的正确性gcd(a,b)=gcd(b,a mod(b))的证明:

第一步:令c为a和b的最大公约数,数学符号表示为c=gcd(a,b)。因为任何俩个实数的最大公约数的最大公约数c一定是存在的,也就是说必然存在俩个数k1,k2使得a=k1*c,b=k2*c

第二步:a mod(b)等价于存在整数r,k3使得余数r=a-k3*b;

 r=a-k3*b=k1*c-k3*k2*c=(k1-k3*k2)c;

 显然,a和b的余数r是最大公因数c的倍数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: