最大公约数

Java中求最大公约数

别说谁变了你拦得住时间么 提交于 2020-03-11 03:21:39
1. 穷举法则 选取两个树中的最小值,小数依次递减,直达两个都树都整除于该树,则为最大公约数。 时间复杂度高,一直递减计算; public static int commonDivisor(int a,int b){ int min = a < b ? a : b; for(int i=min;i>0;i--){ if(a%i == 0 && b%i == 0){ return i; } } return 1; } 2. 辗转相除法 又称欧几里德算法,用较大树除以较小数,再用出现的余数去除除数,再用出现的第二余数去除第一余数,直到最后余数是0为止,最后的除数就是最大公约数。 时间复杂度低,呈指数递减。 欧几里德公式:gcd(a, b) = gcd(b, a mod b) //辗转相除法 public static int commonDivisor2(int a,int b){ int min = a < b ? a : b; int max = a > b ? a : b; int temp; while(max % min != 0){ //min保存余数,max更新为min temp = max % min; max = min; min = temp; } return min; } 来源: CSDN 作者: DuMarch 链接: https://blog.csdn

hdu 1019 最大公约数,最小公倍数

二次信任 提交于 2020-03-10 20:39:11
除了比较常见的gcd函数以外,lcm函数返回的是一个最小公倍数 # include <iostream> # include <cstdio> # include <cstring> # include <map> # include <cmath> # include <algorithm> # include <queue> # include <vector> # define inf 0x3f3f3f3f # define sd(a) scanf("%d",&a) # define mem0(a) memset(a,0,sizeof(a)) # define lowbit(x) ((x)&(-x)) typedef long long ll ; const int mod = 1e9 + 7 ; const int maxn = 30 ; using namespace std ; int gcd ( int a , int b ) { if ( b == 0 ) return a ; else return gcd ( b , a % b ) ; } int lcm ( int a , int b ) { int temp = gcd ( a , b ) ; return a / temp * b ; } int main ( ) { int t , n , temp ;

最大公约数和最小公倍数

耗尽温柔 提交于 2020-03-09 13:31:01
用辗转相处法求最大公约数 最小公倍数为两数的乘积除以两数的最小公倍数 代码如下: 1 //最大公约数和最小公倍数 2 # include<stdio.h> 3 int a,b; 4 int main() 5 { 6 scanf("%d%d",&a,&b); 7 int yue(int,int); 8 int bei(int,int); 9 printf("公约数:%d\n公倍数:%d\n",yue(a,b),bei(a,b)); 10 return 0; 11 } 12 13 //辗转相除法求最大公约数 14 int yue(int a,int b) 15 { 16 int temp,r; 17 if(a<b) 18 { 19 temp=b; 20 b=a; 21 a=temp; 22 } 23 r=a%b; 24 while(r!=0) 25 { 26 a=b; 27 b=r; 28 r=a%b; 29 } 30 return b; 31 } 32 33 int bei(int a,int b) 34 { 35 return a*b/yue(a,b); 36 } 运行结果: 来源: https://www.cnblogs.com/bboykaku/p/12448050.html

Java:求两数的最大公约数

倾然丶 夕夏残阳落幕 提交于 2020-03-08 22:06:08
import java.util.Scanner; public class TestDemo4 { public static void main(String[] args) { Scanner scan = new Scanner (System.in); int a = scan.nextInt(); int b = scan.nextInt(); int c = a%b; while(c != 0){ a = b; b = c; c = a % b; } System.out.println("最大公约数:"+b); } } 将两数a b求余得c:a % b = c; 若c = 0;则b为最大公约数; 若c != 0; 则a = b;b = c;从第一步开始继续执行,直至c = 0. 来源: CSDN 作者: yufy0528 链接: https://blog.csdn.net/yufy0528/article/details/104740368

算法:辗转相除法【欧几里德算法(Euclidean algorithm)】

青春壹個敷衍的年華 提交于 2020-03-08 05:22:10
1.来源 设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q ......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q ......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2, ……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。 例如:a=25,b=15,a/b=1 ......10,b/10=1 ......5,10/5=2 .......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。 2.原理 3.算法 自然语言描述 用辗转相除法确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b): 当a mod b=0 时gcd(a,b)=b,否则 gcd(a,b) = gcd(b,a mod b) 递归或循环运算得出结果 /** * * @return int * @tags @param m * @tags @param n * @tags @return * @todo 【方法二】利用辗除法 */ public static int gcd(int m, int n) { while (true) { if ((m = m % n) == 0) return n; if ((n = n % m) ==

最大公约数(东秦OJ1025)

杀马特。学长 韩版系。学妹 提交于 2020-03-05 12:17:41
题目描述 谷学长有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约数)!因此他经常和别人比赛计算GCD。有一天谷学长很嚣张地找到了你,并要求和你比赛,但是输给谷学长岂不是很丢脸!所以你决定写一个程序来教训他。 输入描述 题目有多组测试用例,每组用例共两行:第一行:一个数A。第二行:一个数B。 对于20%的数据,0 < A , B ≤ 10 ^ 18。 对于100%的数据,0 < A , B ≤ 10 ^ 10000。 输出描述 每组测试用例输出一行,表示A和B的最大公约数。 样例输入 12 54 样例输出 6 提示 1.二进制GCD算法。 2.普通高精度会超时,需要压位,压6到10位即可。 python代码: 1 try: 2 while True: 3 A = int(input()) 4 B = int(input()) 5 while B != 0: 6 t = A 7 A = B 8 B = t%B 9 print A 10 except EOFError: 11 pass View Code 来源: https://www.cnblogs.com/sqdtss/p/12419400.html

Python之递归

北城以北 提交于 2020-03-03 05:28:15
python之递归 递归的特征:有调用自身函数的行为 2.有正确的返回条件(不能写成死循环了) 1. 汉诺塔 def hanoi ( n , x , y , z ) : #n代表盘子的层数(个数),x代表盘子的初始位置,y代表盘子中间缓存的位置,z代表盘子的目的位置,这三个位置一定要搞清楚!!! if n == 1 : print ( x , "-->" , z ) else : hanoi ( n - 1 , x , z , y ) #先将n-1个盘子放到Y上去() print ( x , "-->" , z ) #再将第n个盘子(最底下的盘子)从X放入到Z上面去 hanoi ( n - 1 , y , x , z ) #最后把在Y上面的n-1个盘子放到Z上面去 hanoi ( 3 , "a" , "b" , "c" ) 2. 求阶乘 ``python def factorial ( n ) : if n == 1 : return 1 else : return n * factorial ( n - 1 ) num = input ( "请输入一个整数,以便求其阶乘:" ) num = int ( num ) print ( "%d 的阶乘是 %d" % ( num , factor ( num ) ) ) 3.一块长方形能被切割成完全一样的正方形的边长是多少?

【题解】P1029 最大公约数和最小公倍数问题

你离开我真会死。 提交于 2020-03-02 07:58:11
目录 P1029 最大公约数和最小公倍数问题 方法一 方法二 P1029 最大公约数和最小公倍数问题 方法一 要知道最大公约数和最小公倍数的乘积就是原两个数的积。 换成公式就是: x ∗ y = g c d ( x , y ) ∗ l c m ( x , y ) x*y=gcd(x,y)*lcm(x,y) x ∗ y = g c d ( x , y ) ∗ l c m ( x , y ) 本题中是要找到符合条件的 P = g c d ( x , y ) P=gcd(x,y) P = g c d ( x , y ) Q = l c m ( x , y ) Q=lcm(x,y) Q = l c m ( x , y ) 枚举 i<sqrt(x*y) ,如果 x*y%i==0 ,那么若 gcd(i,mul/i)==x 就cnt+=2; 附奇怪的证明 # include <bits/stdc++.h> using namespace std ; const int N = 1e6 + 10 ; int x , y , mul , cnt ; int main ( ) { cin >> x >> y ; if ( x == y ) cnt -- ; mul = x * y ; for ( int i = 1 ; i * i <= mul ; i ++ ) { if ( mul % i == 0

贝祖公式证明

懵懂的女人 提交于 2020-03-02 00:21:02
贝祖公式证明 前言:最近写一道算法题的过程中,遇到了关于贝祖公式的题目,发现其实很简单。根据前人总结证明方法,进行归纳,在此证明。 一. 欧几里得算法 要证明贝祖公式,首先需要知道欧几里得算法,欧几里得算法也叫辗转相除法,用于求两个整数之间的最大公约数。 公式如下: gcd(a,b) = gcd(b,a mod b) (a>b 且 a mod b 不为0) 证明如下: 因为a>b,所以a可以表示为kb+r,r=a mod b 从左往右看,假设d是a,b的一个公约数,那么a和b都可以被d整除,r=a-kb,自然r也可以被d整除,所以d也是(b,r),也就是(b,a mod b)的公约数。 反过来,假如d是b和r = a mod b的一个公约数,则有b和r都可以被d整除,根据a=kb+r,自然a也可以被d整除,所以d也是(a,b)的公约数。 因此,(a,b)和(b,a mod b)的公约数一致,自然最大公约数也一致。 欧几里得算法应用:不断运用该算法,即“两个整数的最大公约数,等于其中较小的那个数和较大数对较小数取模结果的最大公约数。” 将两个数缩小,直到一个数为0,另一个数就是最小公约数 eg,求12和42的最大公约数,gcd(12,42) = gcd(12,6)=gcd(6,0)=6 二、贝祖公式 根据前面推导的欧几里得算法,贝祖公式就应运而生啦!

扩展欧几里得算法

我怕爱的太早我们不能终老 提交于 2020-03-01 12:21:43
扩展欧几里得算法(欧几里得算法即辗转相除法) 裴蜀定理:有一对正整数a, b,那么一定存在整数x, y,使得 ax + by = (a, b)最大公约数。 举例:存在ax + by = d,则d是a和b的最大公约数的倍数。 Example 给定nn对正整数ai,biai,bi,对于每对数,求出一组xi,yixi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)ai∗xi+bi∗yi=gcd(ai,bi)。 输入格式 第一行包含整数n。 接下来n行,每行包含两个整数ai,biai,bi。 输出格式 输出共n行,对于每组ai,biai,bi,求出一组满足条件的xi,yixi,yi,每组结果占一行。 本题答案不唯一,输出任意满足条件的xi,yixi,yi均可。 数据范围 1≤n≤1051≤n≤105, 1≤ai,bi≤2∗1091≤ai,bi≤2∗109 输入样例: 2 4 6 8 18 输出样例: -1 1 -2 1 //欧几里得算法 #include <iostream> using namespace std; int exgcd(int a, int b, int &x, int &y) { //return b ? gcd(b, b % a) : a; if (!b) //如果b = 0,ax + by = a { //得到一组解 x = 1, y = 0;