最大公约数

求最大公约数(GCD)的两种算法

拜拜、爱过 提交于 2020-02-28 11:24:07
之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种、在处理大数时更优秀的算法——Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a%b) 实现过程演示: sample:gcd(15,10)=gcd(10,5)=gcd(5,0)=5 C语言实现: 1 int Euclid_GCD(int a, int b) 2 { 3 return b?Euclid_GCD(b, a%b):a; 4 } 2.Stein 算法 一般实际应用中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过 64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算 128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。 依据定理: gcd(a,a)=a,也就是一个数和其自身的公约数仍是其自身。 gcd(ka,kb)=k*gcd(a,b),也就是 最大公约数 运算和倍乘运算可以交换。特殊地,当k=2时

最大公约数(辗转相除)

和自甴很熟 提交于 2020-02-26 19:04:59
题目描述 输入两个正整数,求其最大公约数。 输入描述 测试数据有多组,每组输入两个正整数。 输出描述 对于每组输入,请输出其最大公约数。 输入 49 14 输出 7 代码 常规法 # include <iostream> # include <algorithm> using namespace std ; int main ( ) { int i , x , y ; while ( cin >> x >> y ) { int Min = min ( x , y ) ; for ( int i = Min ; i >= 1 ; i -- ) { if ( x % i == 0 && y % i == 0 ) { cout << i << endl ; break ; } } } return 0 ; } 进阶版1:辗转相除法 # include <iostream> using namespace std ; int GCD ( int a , int b ) { return a % b ? GCD ( b , a % b ) : b ; } int main ( ) { int x , y ; while ( cin >> x >> y ) { cout << GCD ( x , y ) << endl ; } return 0 ; } 进阶版2: # include

MATLAB入门学习笔记5

不问归期 提交于 2020-02-26 07:36:53
教程05目录 循环语句(续) while循环-示例3-最大公约数计算 for循环-示例1-简单输出 for循环-示例2-累加计算 for循环-作用的理解 循环语句(续) while循环-示例3-最大公约数计算 最大公约数原理 : 两数相除得到余数(不论是大数除以小数还是反之),此后一直用除数除以余数,直到余数为0,最后一个式子的除数即为最大公约数. (如表:小数除以大数则多出来第一行,并不影响结果) 数1(a) 数2 (b) 商 余数( r ) 196 371 0 196 371 196 1 175 196 175 1 21 175 21 8 7 21 7 3 0 代码 a = input ('a = '); b = input ('b = '); r = mod( a , b ); while r~=0 a=b; b=r; r=mod(a,b); end disp(b) 注意 :不等号表示为“~=” for循环-示例1-简单输出 (1 😃) 代码 for i = -2:1 disp( i ); end 表示 i从-2每次加1,一直加到i等于1.则依次输出四个值,分别是-2、-1、0、1. (2 😃) 如果想要每次以 0.5的步长 增加,则如下: for i = -2: 0.5 :1 disp( i ); end (3 😃) MATLAB中默认从开始值到结束值是递增的 ,因此

java小程序(六)

…衆ロ難τιáo~ 提交于 2020-02-25 22:13:54
【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数, 取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0, 返回较大的数,此数即为最大公约数,最小公倍数为两数之积除以最大公约数。 package case50; import java.util.Scanner; /** * * 【程序6】 * 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 * 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数, * 取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0, * 返回较大的数,此数即为最大公约数,最小公倍数为两数之积除以最大公约数。 * @author 眼睫毛能扫地 * */ //计算最大公约数 class CalGCD { public int CalGCD(int x, int y) { int t = 0; if (x > y) { t = x; x = y; y = t; } while (x != 0) { if (x == y) return y; else { int k = y % x; y = x; x = k; } } return y; } } public class Case06 {

最大公约数与公倍数

余生长醉 提交于 2020-02-08 23:03:28
输入两个正整数,求它们的最大公约数与最小公倍数。 Input输入两个正整数,两个整数之间用空格分开。 数据保证在 int 范围内。 Output第一行输出最大公约数; 第二行输出最小公倍数。 #include<stdio.h> #define max(a,b)(a>b)?a:b #define min(a,b)(a<b)?a:b int main() { int a, b, c, n, m; scanf("%d %d", &a, &b); n=max(a,b); m=min(a,b); while(n%m!=0) { c=n%m; n=m; m=c; }\取最大公约数m printf("%d\n", m); printf("%d\n", a b/m);\取最大公倍数 return 0; } 总结: 1.取最小公约数,注意最大值除最小值,故需判断大小,用define定义即可。 2.最大公倍数=a b/最大公约数。 来源: CSDN 作者: ??.reture 链接: https://blog.csdn.net/waiting121384/article/details/104228536

NOI.1.13.12 分数求和题解 (C++)

别等时光非礼了梦想. 提交于 2020-02-08 15:50:13
NOI.1.13.12 分数求和题解 (C++) 哈喽~ 又见面了。 过了 十八年 一天又是一条 好汉 题解,今天是分数求和,相信再看作者写的题解巨佬已经成功的读完了六年级上册并且学会了分数加法:- )(开个玩笑)。 好了,不说了,请听题: NOI1.13.12:分数求和 总时间限制: 1000ms 内存限制: 65536KB 描述 : 输入n个分数并对他们求和,并用 最简形式 表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。 输入 : 第一行是一个整数n,表示分数个数,1 <= n <= 10; 接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。 输出 : 输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。 样例输入 2 1/2 1/3 样例输出 5/6 做题之前,我还是先说说本题的小技巧: 1. 两数的最小公倍数等于两数的乘积除以两数的最大公约数 ,举个栗子: [3,5] = 3 5/(3,5) = 3 5/1 = 15 [5,15] = 5*15/(5,15) = 75/5 = 15 是不是很好理解? 2.辗转相除法求最大公约数 这个嘛,相信大家都懂,只不过还是在提一提,来个图片外带代码解释一下: 代码: # include <bits/stdc++.h> using

分数 模板

允我心安 提交于 2020-02-07 07:43:31
实数即使用double定义也会损失一定精度,在精度要求很高时,就需要用到分数 0.最大公约数&最小公倍数 # define LL long long LL gcd ( LL a , LL b ) //最大公约数 { if ( b == 0 ) return a ; return gcd ( b , a % b ) ; } LL lcm ( LL a , LL b ) //最小公倍数 { return a * b / gcd ( a , b ) ; } 1.分数存储 struct Fraction //分数 { LL a , b ; void update ( ) //约分 { LL k = gcd ( a , b ) ; a / = k ; b / = k ; return ; } } ; 2.“+” Fraction operator + ( Fraction x , Fraction y ) { Fraction z ; z . a = x . a * y . b + x . b * y . a ; z . b = x . b * y . b ; z . update ( ) ; return z ; } 3.“ - ” Fraction operator - ( Fraction x , Fraction y ) { Fraction z ; z . a = x . a *

Codeup 1818: 最大公约数

♀尐吖头ヾ 提交于 2020-02-05 14:01:45
题目链接 : http://codeup.cn/problem.php?id=1818&csrf=ILu2Xo5W84viHIK6tb9pz99FkeNAZtPK 题目描述 输入两个正整数,求其最大公约数。 输入 测试数据有多组,每组输入两个正整数。 输出 对于每组输入,请输出其最大公约数。 样例输入 49 14 样例输出 7 代码 # include <stdio.h> int gcd ( int a , int b ) { if ( b == 0 ) return a ; else return gcd ( b , a % b ) ; } int main ( ) { int m , n ; while ( scanf ( "%d%d" , & m , & n ) != EOF ) printf ( "%d\n" , gcd ( m , n ) ) ; return 0 ; } 来源: CSDN 作者: CSRhao 链接: https://blog.csdn.net/Rhao999/article/details/104180193

hdu2504(找最大公约数gcd)

☆樱花仙子☆ 提交于 2020-02-04 14:51:48
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2504 题目描述 思路 就是写个gcd函数直接调用就行了。直接看代码吧 ac代码 # include <stdio.h> # define N 100000 int gcd ( int a , int b ) { return b == 0 ? a : gcd ( b , a % b ) ; } int main ( ) { int n , m ; int i ; int t ; scanf ( "%d" , & t ) ; while ( t -- ) { scanf ( "%d%d" , & n , & m ) ; for ( i = m + 1 ; i < N ; i ++ ) { if ( gcd ( n , i ) == m ) break ; } printf ( "%d\n" , i ) ; } return 0 ; } 来源: CSDN 作者: zhoupingqi2017 链接: https://blog.csdn.net/zhoupingqi2017/article/details/104167653

求两个正整数的最大公约数(Java实现)

别来无恙 提交于 2020-02-01 04:20:33
求两个正整数的最大公约数 import java . util . Scanner ; public class Test { public static void main ( String [ ] args ) { //求两个正整数的最大公约数 Scanner scanner = new Scanner ( System . in ) ; System . out . println ( "请输入两个整数" ) ; int num1 = scanner . nextInt ( ) ; int num2 = scanner . nextInt ( ) ; for ( int i = Math . min ( num1 , num2 ) ; i > 0 ; i -- ) { if ( num2 % i == 0 && num1 % i == 0 ) { System . out . println ( "这两个整数的最大公约数是" + i ) ; break ; } } } } 来源: CSDN 作者: JIAYU. 链接: https://blog.csdn.net/qq_45914985/article/details/103788353