#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;
{
int mid = (low + high) / 2;
if (a[mid] < x)
{
low = mid + 1;
}
else if (a[mid] > x)
{
high = mid - 1;
}
else
{
return mid; //found
}
}
{
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
*/
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;
}
{
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的倍数。
欧几里得算法的思想基于辗转相除法的原理,辗转相除法是欧几里得算法的核心思想,欧几里得算法说白了其实就是辗转相除法的计算机算法的事项而已。如果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的倍数。