C语言——求最大公约数及最小公倍数

基本概念

  1. 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。
  2. 最大公约数:也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
  3. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数)。

方法分析

最大公约数

  1. 辗转相除法:

    设两数为a、b(a≥b),求a和b最大公约数的步骤如下:

    ① a%b得余数c

    ② 若c=0,则b即为两数的最大公约数

    ③ 若c≠0,则a=b,b=c,再回去执行①

  2. 更相减损法:

    设两数为a、b,求a和b最大公约数的步骤如下:

    ① 若a>b,则a=a-b

    ② 若a

最小公倍数

  1. (a,b)[a,b]=ab

    先算出ab及[a,b]相除即为最小公倍数。

  2. 穷举法:

    设两数为a、b(a≥b),t=a,i=1求a和b最小公倍数的步骤如下:

    ① a%b得余数c

    ② 若c=0,则a即为两数的最小公倍数

    ③ 若c≠0,则i=i+1,a=t*i,再回去执行①

代码实现

最大公约数

  1. 辗转相除法:
int HCD(int x, int y)
{
int temp;
if (x < y)  //如果x<y交换x,y
{
temp = x;
x = y;
y = temp;
}
while (x%y) //x%y!=0时
{
temp = x;
x = y;  //将y赋给x
y = temp % y;   //余数赋给y
}
//直到x%y == 0时y为最大公约数
return y;

}
  1. 更相减损法:
int HCD(int x, int y)
{
    int MAX = x > y ? x : y;
    int MIN = x < y ? x : y;
    int TEMP = MAX - MIN;

    if (TEMP == 0)
        return MAX;   //递归终止
    else
        HCD(TEMP, MIN); //递归

}

最小公倍数

  1. (a,b)[a,b]=ab
//求最大公约数 辗转相除法
int HCD(int x, int y)
{
int temp;
if (x < y)  //如果x<y交换x,y
{
temp = x;
x = y;
y = temp;
}
while (x%y) //x%y!=0时
{
temp = x;
x = y;  //将y赋给x
y = temp % y;   //余数赋给y
}
//直到x%y == 0时y为最大公约数
return y;

}
//求最小公倍数(a,b)[a,b]=ab
int ICM2(int x, int y)
{
return x*y / HCD2(x, y);
}
  1. 穷举法:
//求最小公倍数
int ICM(int x, int y)
{
int temp;
int i = 1;
if (x < y)  //如果x<y交换x,y
{
temp = x;
x = y;
y = temp;
}
temp = x;
while (x%y) //x%y!=0时
{
i++;
x = temp * i;//将x*1、x*2...赋给x
}
//直到x%y == 0时x为最小公倍数
return x;

}

参考文章:

  1. 常见算法:C语言求最小公倍数和最大公约数三种算法——CSDN
  2. C语言计算2个数的最小公倍数——博客园
  3. 百度百科
时间: 2024-12-23 15:54:20

C语言——求最大公约数及最小公倍数的相关文章

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

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

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

其算法过程为:前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数 1.大数放a中.小数放b中: 2.求a/b的余数: 3.若temp=0则b为最大公约数: 4.如果temp!=0则把b的值给a.temp的值给b: 5.返回第第二步: #include <stdio.h> #include <math.h> void main(){ int divisor(int a,int b); int multiple(int a,int b); printf("The

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

// // main.c // shuzu_gongyushu // // Created by jereh123 on 15/7/22. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> //最大公约数 int getMaxCommonDivisor(int num1,int num2); int getMaxCommonDivisor(int num1,int num2){ //num1

奇葩的求最大公约数、最小公倍数、分解质因数的做法(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

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

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

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

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

c语言:辗转相除法求最大公约数、最小公倍数

辗转相除法,又称欧几里得算法.两个正整数a和b(a>b),它们的最大公约数等于余数c和较小的数b之间的最大公约数.最小公倍数=两数之积/最大公约数 #include <stdio.h>int get1(int a, int b){ if (a < b) { int c = a; a = b; b = c; } while (a%b != 0) { b = a%b; a = b; } return b;}int get2(int a,int b){ return a*b / get1

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

#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)

求最大公约数与最小公倍数and输出锥形图案

1:描述:用Python求两个数的最大公约数与最小公倍数.(注意输入的俩个数在正整数范围内) code(代码): a=eval(input('请输入第一个整数:')) b=eval(input('请输入第二个整数:')) c=1 d=a*b if(a<=0 or b<=0): print('输入有误') else: if(a<b): c=a a=b b=c while(c!=0): c=a-b if(c==0): break else: if(c>b): a=c else: a=b