最大公约数

最大公约数算法

a 夏天 提交于 2019-12-03 10:24:31
欧几里得算法(辗转相除法) 具体思路是: 这条算法基于一个定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。 首先,我们先计算出a除以b的余数c,把问题转化成求出b和c的最大公约数;然后计算出b除以c的余数d,把问题转化成求出c和d的最大公约数;再然后计算出c除以d的余数e,把问题转化成求出d和e的最大公约数……以此类推,逐渐把两个较大整数之间的运算简化成两个较小整数之间的运算,直到两个数可以整除,或者其中一个数减小到1为止。 ———————————————— 版权声明:本文为CSDN博主「J0han」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/J0Han/article/details/82467335 该版本的代码运行会出现不可知的错误,所以又找了如下链接可运行 https://www.cnblogs.com/tianqizhi/p/8341415.html 来源: https://www.cnblogs.com/sisterben/p/11790968.html

初等数论初步――最大公因数

匿名 (未验证) 提交于 2019-12-03 00:41:02
一、定义 定义:给定两个整数a,b,必有公共的因数,叫做它们的公因数,当a,b不全部为0时,在有限个公因数中最大的那个叫做a、b的最大公因数,记作(a,b) 二、一种方法――辗转相除法 描述:设a,b为任意两个整数,且b不为0,应用带余除法,以b除a,得到商q1,余数r1;如果余数r1不为0,以r1除b,得到商q2,余数r2;如果r2不等于0,以r2除r1,如此继续下去,在有限个除法后,必然得到rn不为0且整除rn-1。 三、最大公约数的性质 关于最大公约数有一条重要的性质,这条性质在求解一次同余方程和不定方程时经常遇到。 1) 证明:不妨设b>0,用b除a,则有a = b*q1 + r1, 若r1 = 0,(a,b) = (b,r1) = b;所以(a,b) = a * 0 + b * 1 若r1 != 0,用r1除b;b = r1 * q2 + r2,   若r2 = 0,(a,b) = (b,r1) = (r1,r2) = r1 = a - b * q1;所以(a,b) = a * 0 + b * (-q1)   若r2 != 0,用r2 除r1;r1 = r2 * q3 + r3.     若r3 = 0,(a,b) = (r2,r3) = r2 = b - r1 * q2 = b - (a - b * q1) * q2;所以(a,b) = a * (-q2) + b *

C++最大公约数

匿名 (未验证) 提交于 2019-12-03 00:34:01
#include<iostream> using namespace std; int gcd(int m,int n); int main() {int a,b; cin>>a>>b; cout<<gcd(a,b); return 0;} int gcd(int m,int n) { int c; while(m%n!=0) {c=m%n; m=n; n=c;} return n;} 转载请标明出处: C++最大公约数 文章来源: C++最大公约数

js_最大公约数,用递归的方式和循环两种方式

匿名 (未验证) 提交于 2019-12-03 00:34:01
一、循环的方式: //功能:求两个数的最大公约数 //参数:两个数: //返回值:最大公约数 function f(m,n){ //1、求最小数 var min = m<n?m:n; //2、从大到小循环找第一个公约数 for(var i=min;i>=2;i--){ if(m%i==0 && n%i==0){ return i; } } return 1; } 二、递归的方式: 首先确定如何求最大公约数,我们采用欧几里得算法( 辗转相除法 ),算法描述如下: 例:48,57 9%3=0 如下示意图: //功能:求两个数的最大公约数 //参数:两个数: //返回值:最大公约数 function f(m,n){ //大数能否整除小数, if(m>n){ var max = m; var min = n; }else{ var min = m; var max = n; } if(max%min==0){ //1、如果能整除,小数就是最大公约数 return min; }else{ //2、如果不能整除,那就求小数和余数的最大公约数 return f(min,max%min); } } 文章来源: js_最大公约数,用递归的方式和循环两种方式

用C语言递归求最大公约数

匿名 (未验证) 提交于 2019-12-03 00:18:01
初学递归接触的就是什么汉诺塔问题,足够经典;但是之前用辗转相除法求最大公约数是不是不够方便?用递归实现代码简单;而且思路也简单: int f(int m,int n){ if(m%n == 0)return n; else return f(n,m%n); } 这是关键代码,f是函数,在函数内又调用自身;是不是很简单! 全部代码: #include<stdio.h> void swap(int *m,int *n){ int t; if(m < n){ t = n; n = m; m = t; } } int f(int m,int n){ if(m%n == 0)return n; else return f(n,m%n); } int main(){ int p = 0,m = 0,n = 0; printf("请按照由大到小的顺序输入两个整数,用空格隔开:\n"); scanf("%d%d",&m,&n); swap(m,n); p = f(m,n); printf("两个数的最大公约数是:%d\n",p); return 0; } 因为参数必须要第一个比第二个大,所以还要有个交换函数,这样就可以保证参数的正确性了,哈哈! 文章来源: 用C语言递归求最大公约数

求最大公约数的欧几里得算法与其伪代码

匿名 (未验证) 提交于 2019-12-03 00:17:01
a,b最大公约数(Greatest Common Divisor),就等于b,a%b的最大公约数,公式如下 gcd(a,b)=gcd(b,a%b) gcd(a,b) = gcd(b,a % b) gcd(a,b)=gcd(b,a%b) 摘自 欧几里得算法(求解最大公约数的优质方法)以及原理拓展 Begin 输入 A,B A对B取余,结果赋值为R 若R=0,则B是最大公约数 若R不等于0,则以B为A,以R为B循环上一步 来源:博客园 作者: 191307 链接:https://www.cnblogs.com/ruier/p/11794829.html

区间最大公约数

匿名 (未验证) 提交于 2019-12-03 00:14:01
AcWing #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #define ll long long using namespace std; inline ll read(){ ll x=0,o=1;char ch=getchar(); while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar(); if(ch=='-')o=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*o; } const int N=500005; ll n,m,a[N],b[N],c[N]; struct XD_Tree{ll l,r,data;}t[N<<2]; inline ll gcd(ll a,ll b){ if(!b)return a; return gcd(b,a%b); } inline void build(int p,ll l,ll r){ t[p].l=l;t[p].r=r; if(l==r){t[p].data=b[l];return

最大公约数的计算

匿名 (未验证) 提交于 2019-12-03 00:12:02
定义: /* * 利用枚举法求出两个数的最大公约数 * 思想:先找出两个数的最小值,因为两数的最大公约数一定要比两数的最小值还要小,所以先求出两数的最小值 * 在和两个数同时取余,若和两个数同时取余都为0,那么在当前阶段它就是最大公约数,直到for循环结束,即是两个数的最大公约数 */ #include <stdio.h> int main() { int a,b; int min; scanf("%d %d",&a,&b); if(a<b) { min=a; } else { min=b; } int gcd = 0; int i; for(i = 1;i < min; i++) { if(a % i == 0&& b % i == 0) gcd = i; } printf("%d 和 %d 的最大公约数是 %d\n",a,b,gcd); } /* * 利用辗转相除法求最大公约数 * 举例: * a b t(a%b) * 12 18 12 * 18 12 6 * 12 6 0 * 6 0 * 如上述所示当b为0时,计算结束,a就是最大公约数 * 否则,计算a%b,让a = b,b = a%b * 回到第一步 */ #include <stdio.h> int main() { int a,b; int t; scanf("%d %d",&a,&b); while (b != 0)

最大公约数

匿名 (未验证) 提交于 2019-12-02 23:57:01
题目描述: 给定 2 个数,a 和 b (3 < a, b <= 10000),求出 a 和 b 的最大公约数。 输入描述: 多组输入,输入的第一行为一个正整数 n,表示接下来有 n 组数据,每一行为两个正整数 a, b (3 < a, b <= 10000)。 输出描述: 对于每一组数据,求出 a 和 b 的最大公约数。 样例输入: 2 2 4 3 5 样例输出: 2 1 1 #include <iostream> 2 #include <math.h> 3 using namespace std ; 4 int main (){ 5 int n ; 6 cin >> n ; 7 while ( n --) { 8 int a , b , i ; 9 cin >> a >> b ; 10 for ( i = min ( a , b ); i >= 2 ; i --) 11 if ( a % i == 0 && b % i == 0 ) break ; 12 cout << i << endl ; 13 } 14 return 0 ; 15 } 来源:博客园 作者: 潜心悟道 链接:https://www.cnblogs.com/cc99/p/11478284.html

计算最大公约数

匿名 (未验证) 提交于 2019-12-02 23:57:01
1、辗转相除法: 欧几里得算法 据说是最早的算法,用于计算最大公约数,也是数论的基础算法之一。又被称之为辗转相除法。 具体做法: 1.用较小数除较大数, 2.再用出现的余数(第一余数)(变成这一轮的除数)去除除数(变成这一轮的被除数) 3.再用出现的余数(第二余数)(变成这一轮的除数)去除第一余数(变成这一轮的被除数) 4.如此反复 5.直到最后余数是0为止。 //迭代法(递推法):欧几里得算法:计算分子分母的最大公约数 public long getGcd(long a, long b) { while (a % b != 0) { long temp = a % b; a = b; b = temp; } return b; } //或许你会看到这个版本的代码,效果相同 public long getGcd(long a, long b) { while ( b > 0) { long temp = a % b; a = b; b = temp; } return a; } 2、更相减损术: https://www.cnblogs.com/laizhenghong2012/p/8457784.html 更相减损术出自《九章算术》,其原理很简单:两个正整数a和b(a > b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。依次递归下去,直到两个数相等