【C】计算两个整数的最大公约数和最小公倍数

数学知识背景记录:

任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现。

则整数x,y可以分别标记为:
x=p1x1p2x2...pmxm

y=p1y1p2y2...pmym

(其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0)

(1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym)

(2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym)

(3)因此,亦可得:lcm(x,y)*gcd(x,y)=x*y

按如上思路计算gcd(x,y)//函数 int get_gcd(int x,int y);

实际上若是单纯的计算最大公约数和最小公倍数可以不必这么复杂,可以从大到小遍历min(x,y)的约数,找到的第一个公约数即为所求。

 1 int get_gcd(int x,int y)
 2 {
 3     int temp;
 4     int i;
 5     if(x>y)
 6     {
 7         temp=x;
 8         x=y;
 9         y=temp;
10     }
11     if(y%x==0)
12         return x;
13     for(i=x/2;i>1;i--)
14         if(x%i==0)
15             if(y%i==0)
16                 return i;
17     return 1;
18 }
19
20 int get_lcm(int x,int y)
21 {
22  return (x*y)/(get_gcd(x,y));
23 }
时间: 2024-10-09 13:30:38

【C】计算两个整数的最大公约数和最小公倍数的相关文章

计算两个整数的最大公约数和最小公倍数

算法一 任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现. 则整数x,y可以分别标记为:x=p1x1p2x2...pmxm y=p1y1p2y2...pmym (其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0) (1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym) (2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym

002:求两个整数的最大公约数和最小公倍数

求最大公约数可采用辗转相除法,其流程如图所示. 最小公倍数就是两个整数的乘积除以其最大公约数. 1 #include <stdio.h> 2 3 int main() 4 { 5 unsigned long a, b, c=0; //两个整数和临时变量 6 unsigned long lcm=0, gcd=0; //最小公倍数和最大公约数 7 8 while( 1 ) 9 { 10 printf("Please input two positive integers(spacebar

求两个整数的最大公约数和最小公倍数

//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ascNum(int *p1,int *p2) { int temp; if(*p1 > *p2) { temp = *p2; *p2 = *p1; *p1 = temp; } } //求两个整数的最大公约数 辗转相除法 int getAppr(int a, int b) { int c; ascNum

C++求两个整数的最大公约数和最小公倍数

最小公倍数=两个整数的成绩 / 最大公约数 求最大公约数的方法: (1)辗转相除法 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b,tmp,m; 6 cin>>a>>b; 7 m=a*b; 8 if(a<b) 9 { 10 tmp=b; 11 b=a; 12 a=tmp; 13 } 14 while(b!=0) 15 { 16 tmp=a%b; 17 a=b; 18 b

2015华为机试——计算两个正整数的最大公约数和最小公倍数

题目描述: 接口说明 原型: long getMaxDivisor(long lFirstInput, long lSecondInput); 输入参数: int first: 第一个整数; int second: 第二个整数; 返回值: 最大公约数 long getMinMultiple(long lFirstInput, long lSecondInput); 输入参数: int first: 第一个整数; int second: 第二个整数; 返回值: 最小公倍数 解题思路:使用辗转相除法

求两个整数的最大公约数与最小公倍数

//输入两个正整数m和n,求其最大公约数和最小公倍数. 方法一: public class ZuiDaoGongYueShuYuZuiXiaoGongBeiShu { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入第一个整数m: "); int m=scanner.nextInt(); System.out.println(&

php计算两个整数的最大公约数常用算法小结

//欧几里得算法function ojld($m, $n) {    if($m ==0 && $n == 0) {        return false;    }    if($n == 0) {        return $m;    }    while($n != 0){        $r = $m % $n;        $m = $n;        $n = $r;    }    return $m;} //基于最大公约数的定义function baseDefin

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。

题目描述 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 30 代码:#include<stdio.h>int gys(int a,int b){    while(a%b!=0)    {        int t;        t=a%b;        a=b;        b=t;        }        return b;    }int gbs(int a,int b){     return a*b/gys(a,b);    }int m

php取两个整数的最大公约数算法大全

php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( " " , microtime ()); return ((float) $usec + (float) $sec );}////////////////////////////////////////////欧几里得算法function ojld($m, $n) { if($m ==0 &a