辗转相处法求最大公约数【C语言】

#include<stdio.h>
int main()
{
    int a,b,r;
    scanf("%d%d",&a,&b);
    r=a%b;
    while(r!=0)
    {
        a=b;
        b=r;
        r=a%b;
    }
    printf("%d",b);
    return 0;
}

时间: 2024-12-08 08:18:21

辗转相处法求最大公约数【C语言】的相关文章

欧几里得算法求最大公约数(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也

辗转相除求最大公约数

序 求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法.问题定义为求i和j的最大公约数gcd(i,j),其中i和j是整数,不妨设i>j.算法可以递归的表示:1. 如果j能整除i,那么gcd(i,j)=j: 2. j不能整除i,令r=i%j,那么gcd(i,j)=gcd(j,r). C实现 int gcd(int i, int j) { int r = i % j; return r == 0 ? j : gcd(j, r); } 分析 算法的步骤1,显然成立(最大公约数定义): 要证明步

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

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; 所以由以上的推论,我

辗转相除 求最大公约数!or 最小公倍数

求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: a=b: b=temp } 最后a即为两数的最大公约数,最大公倍数为: a*b/最大公约数 c语言代码: 01.int divisor (int a,int b) /*自定义函数求两数的最大公约数*/ 02.{ 03. int temp; /*定义整型变量*/ 04. if(a<b) /*通过比较

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

对分查找 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 r

Hrbustoj 2266 Legendary Weights(辗转相除求最大公约数)

题意:这个题目的意思是给出一些砝码,问我们能不能根据这些砝码称量出任意重量的物品,最大公约数并不难求,难的在于如何建立这个模型. 思路:根据数论的基础知识,两个数a,b的最大公约数是a*x + b*y线性方程的最小正值(证明从略),所以很同意接受这个现实,当这些数的gcd为1的时候,线性方程可以表示(1,+OO)的任意整数,所以肯定可以.但这个题有一个坑点,那就是当最大公约数为2的时候也是可以的,加入物品重m,若m不可以被恰好表示出来,m总可以被控制在m-1和m+1的范围内,m是整数,所以可以确

辗转相除求最大公约数与最小公倍数

#include<stdio.h> int gcd(int a,int b) { if(b!=0) gcd(b,a%b); else return a; } int lcm(int a,int b) { return a*b/gcd(a,b);  //a/gcd(a,b)*b防溢出 } int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF){ printf("%d %d\n",gcd(a

辗转相减求最大公约数

#include <iostream> int main() { using namespace std; int m, n; cin >> n >> m; while (m != n) { while (m>n) { m = m - n; } while (n>m) { n = n - m; } } printf("%d\n", m); system("pause"); return 0; } 运行结果:

关于欧几里得算法求最大公约数,即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 }