辗转相除法求最大公约数------一行代码

今天学到一行代码,感觉好牛逼--------当然是老师上课讲的.

辗转相除法是求最大公约数最好的方式了吧!

辗转相除法原理我也不想多说,百度一下就可以了(基本就是用大数与小数取余,再用比余数大一点的数与余数取余,

   反复直到出现余数为0,那个比0大一点的数就是最大公约数)

好了,废话不多说了------上代码

int gcd(int m, int n){
        return n % m == 0 ? m : gcd(n%m, m);
    }

详细讲解一下:

  优势是使用了递归,一直让大数与小数取余,直到出现0,那么那个小数就是最大公约数.

  当m是较小数时, return n % m == 0 ? m : gcd(n%m, m);中,如果一次得不到最大公约数,那么gcd(n%m, m)中第二个参数

    就应该换为第一次中的较小数了.

  当m是较大数时,自习观察代码,就会发现叫大数和较小数互换了位置.

原文地址:https://www.cnblogs.com/S-Evildoer/p/10786244.html

时间: 2024-10-13 21:47:04

辗转相除法求最大公约数------一行代码的相关文章

鸡兔同笼问题、百鸡问题、辗转相除法求最大公约数

一.鸡兔同笼 鸡和兔子35只,腿一共有94条,求出鸡和兔子的数量各是多少?(鸡的数目是23,兔子的数目是12) $n = 0; for($ i=1;$i<35;$i++){ $n ++; //n=34; $ j=35-i; if(i*2+j*4==94){ printf("鸡的数目是%d只, 兔子的数目是%d只",$i,$j); } } 此时,循环进行了34次.但是,有些循环是无意义的,因为得到了结果,循环还在继续往下执行.我们知道:两个未知数,两个方程,其方程组的解唯一!那么我

辗转相除法求最大公约数

辗转相除法求最大公约数 设两数为a.b(b<a),求它们最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r).若r1=0,则(a,b)=b:若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止.其最后一个非零余数即为(a,b). 从某处找的证明: 原理及其详细证明 在介绍这个方法之前,先说明整除性的一些特点(下文的所有数都是正整数,不再重覆),我们可以这样给出

[算法]辗转相除法求最大公约数

辗转相除法用得比较多,今天Mark一下.具体做法就是:如果q和r分别是m除以n的商及余数,即m=nq+r,那么m和n的最大公约数等于n和r的最大公约数. 代码如下: public static int gcd(int m, int n) { return n == 0 ? m : gcd(n, m % n); }

辗转相除法求最大公约数,非goto

1 #include<iostream> 2 using namespace std; 3 //不推荐用goto,当然用它更快 4 //辗转相除法求两数的最大公约数 5 int gcd(long int a,long int b){ 6 int x=a<b?a:b; 7 //获得较小者,用来做循环的约束值 8 9 for(int i=0;i<x;x++){ 10 //循环 11 if(a>b){ 12 int r=a%b;//取余数 13 if(r==0){//能否整除判断

辗转相除法求最大公约数和最小公倍数分析

求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p

C辗转相除法求最大公约数的实现

int gcd(int a, int b)//求最大公约数,a为分子,b为分母 { if(b == 0) return a; return gcd(b,a%b); }

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

要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } 代码: int gongyue() { int yushu,a,b; while(b) { yushu=a%b; a=b; b=yushu; } return b; } 此子函数可以求出两个数的最大公约数n    最小公倍数为a*b/n:

nyoj 189 兔子的烦恼(一)(辗转相除法求最大公约数)

题目189 题目信息 运行结果 本题排行 讨论区 兔子的烦恼(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在问,兔子能否避免这场灾难? 例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,0; 输入 有多组测试数据,不超过1000组; 每组有两个整数m,n(0<m,n<=1000); 注意:程

c语言学习之 辗转相除法求最大公约数

1. 如果b等于0,则计算结束,最大公约数是a, 2. 否则,计算a除以b的余数,让a等于b,让b等于那个余数, 3.回到第一步. 代码实现: 1 #include <stdio.h> 2 3 int main() 4 { 5 int a, b; 6 scanf("%d %d", &a, &b); 7 int t; 8 9 while ( b != 0){ 10 t = a % b; 11 a = b; 12 b = t; 13 printf("a