对分查找、欧几里得算法求最大公约数

对分查找

 1 int BinarySearch(const int A[], int x, int N)
 2 {
 3    int low, mid, high;
 4    low = 0, high = N - 1;
 5    while(low <= high)
 6    {
 7       mid = (low + high) / 2;
 8       if(A[mid] < x)
 9          low = mid + 1;
10       else
11          if(A[mid] > x)
12          high = mid - 1;
13       else
14          return mid;
15    }
16    return NotFound;
17 }

欧几里得算法求最大公因数:

 1 unsigned Gcd(unsigned int M, unsigned int N)
 2 {
 3    unsigned int Rem;
 4    while(N > 0)
 5    {
 6       Rem = M % N;
 7       M = N;
 8       N = Rem;
 9    }
10    return M;
11 }

原文地址:https://www.cnblogs.com/hi3254014978/p/9459172.html

时间: 2024-10-08 07:02:53

对分查找、欧几里得算法求最大公约数的相关文章

欧几里得算法求最大公约数(gcd)

关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } 证明: 对于a,b,有a = kb + r  (a , k , b , r 均为整数),其中r = a mod b . 令d为a和b的一个公约数,则d|a,d|b(即a.b都被d整除), 那么 r =a - kb ,两边同时除以d 得 r/d = a/d - kb/d = m (m为整数,因为r也

欧几里得算法求最大公约数+最小公倍数

1,两个数互质:如果说两个数的公因数只有1,则可以说这两个数互质. 欧几里得算法求最大公约数: 首先求最大公约数,假设我们要求a和b的最大公约数 设a mod b = c: 可以得到一下的递推过程: a = kb + c ; 假设a , b 的最大公约数为d,则可以得到: a = md , b = nd; 可知m , n 互质: c = a - kb = md - knd = (m-kn)d; 我们已经知道m,n互质,则可以知道n和m-kn互质,则c和b的最大公约数也是d; 所以由以上的推论,我

关于欧几里得算法求最大公约数,即OJ1029的参考解法

1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 int a,b,c; 5 scanf("%d %d",&a,&b); 6 while(b>0) 7 { 8 c=a%b; 9 a=b; 10 b=c; 11 } 12 printf("%d\n",a); 13 return 0; 14 }

欧几里得算法求最大公约数

1 #include <iostream> 2 using namespace std; 3 4 int gcd(int m , int n) 5 { 6 int r; 7 while(n!=0) 8 { 9 r = m%n; 10 m = n; 11 n = r; 12 gcd(m,n); 13 } 14 return m; 15 } 16 17 int main(int argc, char* argv[]) 18 { 19 cout << gcd(4,2) <<

欧几里得算法求最大公约数模板

#include<cstdio> #include<iostream> #include<cstdlib> #include<iomanip> #include<cmath> #include<cstring> #include<string> #include<algorithm> using namespace std; int a,b; int gcd(int a,int b) { if(b==0) re

欧几里得算法——求取最小公约数

1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 14-5-20. 5 */ 6 public class Euclid { 7 public static void main(String[] args){ 8 Scanner scanner=new Scanner(System.in); 9 String str=scanner.nextLine(); 10 int a=Integer.parseInt(s

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理.可能是本人时间长没看算法,脑子都生锈了. 看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为....在我还没看懂的时候,突然来了个所以...然后公式就这样推出来的.⊙﹏⊙b汗! 经过我这令人捉急的小脑袋转了半天,最后有了点眉目,所以拿出来和大家分享一下! 1.首先说一下:欧几里得算法是求两个数的最大公约数的,你可能会问:什么是最大公约数?

欧几里得算法求两个整数的最大公因数

unsigned int Gcd (unsigned int m,unsigned int n){ unsigned int rem; while(n>0){ rem = m % n; m = n; n = rem; } return m; } 对于m<n的情况,第一次循环m,n会交换 算法的时间复杂度计算 时间复杂度 logn 若M > N,则第一次循环交换M和N. 若想分析其时间复杂度,则要求循环次数,即生成余数的次数. 可以证明: 当M > N, 则M % N < M

拓展欧几里得算法求不定方程

对于 ax+by=gcd(a,b) 这样的方程,可以用扩展欧几里得算法exgcd求出一组通解. 根据欧几里得求gcd: gcd(a,b)=gcd(b,a%b) 可得 bx+(a%b)y=gcd(b,a%b) 根据 a%b=a−(a/b)∗b 可得 bx+ay−(a/b)b∗y=gcd(b,a%b) 化简得 ay+b(x−(a/b)y)=gcd(b,a%b) x′=y,y′=(x−(a/b)y) ax′+by′=gcd(b,a%b)<=>ax+by=gcd(a,b) 根据 gcd(a,0)=a