Binary Search and Euclid Algorithm

本文介绍了一种标准的二分查找算法实现,该算法使用两个比较操作完成每一级搜索,并返回找到元素的索引或未找到时的特殊值。此外,还详细解释了用于计算最大公约数的欧几里得算法,并通过辗转相除法的原理证明了其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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的倍数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值