辗转相除 求最大公约数!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)             /*通过比较求出两个数中的最大值和最小值*/
05.  {
06.      temp=a;
07.      a=b;
08.      b=temp;
09.    } /*设置中间变量进行两数交换*/
10.   while(b!=0)           /*通过循环求两数的余数,直到余数为0*/
11.   {
12.      temp=a%b;
13.      a=b;              /*变量数值交换*/
14.      b=temp;
15.    }
16.  return a;            /*返回最大公约数到调用函数处*/
17.}
18.
19.
20.int multiple (int a,int b)  /*自定义函数求两数的最小公倍数*/
21.{
22.  int temp;
23.  temp=divisor(a,b);  /*调用自定义函数,求出最大公约数*/
24.  return  (a*b/temp); /*返回最小公倍数到主调函数处进行输出*/
25.}  

戳这里

时间: 2024-11-08 17:17:26

辗转相除 求最大公约数!or 最小公倍数的相关文章

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

#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

辗转相除求最大公约数

序 求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法.问题定义为求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,显然成立(最大公约数定义): 要证明步

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

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

辗转相减求最大公约数

#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; } 运行结果:

求最大公约数和最小公倍数

学习C++入门级的题目,求最大公约数和最小公倍数,这里介绍两种求最大公约数的方法,即辗转相除法和辗转相减法.辗转相除法的原理自行百度,辗转相减法的原理就是只要两数不想等就用大数减小数,直至相等,求最小公倍数的方法就是用两数的乘积除以最大公约数. #include<iostream> using namespace std; int maxf(int a,int b)//辗转相减法 { while(a != b) { if(a > b) return a = a - b; else ret

C语言求最大公约数和最小公倍数

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

奇葩的求最大公约数、最小公倍数、分解质因数的做法(C语言)

奇葩的求最大公约数.最小公倍数.分解质因数的做法(C语言) 1 /* 2 最奇葩的求最大公约数与最小公倍数 3 create by laog 4 time 2017年7月27日12:23:14 5 */ 6 7 //两个数的最大公约数 8 //两个数的最小公倍数 9 //将一个正整数分解质因数 --和 2.3.5取余 10 11 #include <stdio.h> 12 13 int main1() 14 { 15 // 3,4 16 //20 17 int v; 18 scanf(&quo

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

求最大公约数和最小公倍数 程序分析: (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

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

#include<stdio.h>  void main()   /*  辗转相除法求最大公约数 */   {      int m,n,a,b,t,c;      scanf("%d%d",&a,&b);     m=a;    n=b;     while(b!=0)  /* 余数不为0,继续相除,直到余数为0 */      {    c=a%b;    a=b;     b=c;   }     printf("%d\n", a)