两数的最大公约数、最小公倍数

几个整数,公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。例如:12、16的公约数有±1、±2、±4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16) = 4。12、15、18的最大公约数是3,记为(12,15,18) = 3。
    几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数。例如:4的倍数有±4、±8、±12、±16,……,6的倍数有±6、±12、±18、±24,……,4和6的公倍数有±12、±24,……,其中最小的是12,一般记为[4,6] = 12。12、15、18的最小公倍数是180。记为[12,15,18] = 180。若干个互质数的最小公倍数为它们的乘积的绝对值。*/
//由概念得:公约数中这几个数可正可负,最大公约数为正  公倍数中这几个数必须为正,结果为正

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int MaxDiv(int div1, int div2)
{
 //思路:辗转相除法(还有更相减损法), 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至3000年前。
 //首先,两数必须同为正
 assert(div1); assert(div2);
 int rem = div1%div2;
 while (rem = div1%div2)
 {
  div1 = div2;
  div2 = rem;
 }
 return div2;
}

int MinMul(int mul1, int mul2)
{
 //思路:两数的乘积除以两数的最大公约数
 assert(mul1); assert(mul2);
 return mul1*mul2 / MaxDiv(mul1, mul2);
}

void test()
{
 int a = 0, b = 0;
 scanf("%d", &a);
 scanf("%d", &b);
 printf("MaxDiv = %d\n", MaxDiv(a, b));
 printf("MinMul = %d\n", MinMul(a, b));
}
int main()
{
 test();
 system("pause");
 return 0;
}
时间: 2024-10-06 06:25:36

两数的最大公约数、最小公倍数的相关文章

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理.可能是本人时间长没看算法,脑子都生锈了. 看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为....在我还没看懂的时候,突然来了个所以...然后公式就这样推出来的.⊙﹏⊙b汗! 经过我这令人捉急的小脑袋转了半天,最后有了点眉目,所以拿出来和大家分享一下! 1.首先说一下:欧几里得算法是求两个数的最大公约数的,你可能会问:什么是最大公约数?

如何求两数的最大公约数

一: 更相减损 //熟知的辗转相除法变形 main() { int a,b; scanf("%d %d",&a,&b); while(a!=b) { if(a>b) a-=b; else b-=a; } printf("%d",a); } 二: 辗转相除 //一般用递归描述算法 gcd(m,n)与gcd(n,m mod n)相同 为什么? gcd(m,0)=m 为什么? 两数不需比较大小也行 为什么 ? main() { int a,b,r,t

关于两数的最大公约数gcd

深根半夜里研究C++的语法,在弄到关于函数的定义 这一部分时突然想写个试试,就拿比较熟悉的gcd来好了. 活这么久gcd一直是用辗转相除法(或者说欧几里得算法)得出的,根据<算法导论>第三版的中文页码P547给出的伪代码,很容易就得出C++的写法. int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a % B); } However---- 当a,b比较大的时候显得特别慢,所以出现了来自<九章算术>中的更相减损术来

求两数的最大公约数

1 int fun(int a, int b) { 2 while (b != 0) { 3 int remainder = a % b; 4 a = b; 5 b = remainder; 6 } 7 return a; 8 } 原文地址:https://www.cnblogs.com/moujun1001/p/9615767.html

求两数最小公倍数

输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:sum123.cpp * 作 者:林海云 * 完成日期:2015年1月10日 * 版 本 号:v2.0 * * 问题描述:求两数的最小公倍数 * 输入描述:两个整数 * 程序输出:最小公倍数 */ #include<iostream> using namespace std; int gcd(int x,int y); int gad(int x,int

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

12--c完数/最大公约数/最小公倍数/素数/回文数

完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). [cpp] view plain copy #include <stdio.h> #include <math.h

c语言求两个数的最大公约数和最小公倍数

#include <stdio.h> int main() { // 两个数的最大公约数求法:最大公约数是这两个数之间公共最大的约数,我们可以先找到这两个数的比较小的数: int num1, num2, gys, gbs; scanf("%d,%d", &num1, &num2); int ji = num2*num1; if (num1>num2) { // 找到两个数较小的数 int temp; temp = num1; num1 = num2;

特殊数求解(最大公约数/最小公倍数/素数)

1.最大公约数(GCD) (1)如果a,b全为0,GCD不存在 (2)如果a.b其中之一为0,则GCD为a.b中非零的那个 (3)如果a.b都不为0,则使新的a=b,b=a%b,然后重复过程. 非递归 int gcd(int a, int b){ while (b != 0){ int t = a%b; a = b; b = t; } return a; } 递归 int gcd(int a,int b){ return b!=0?gcd(b,a%b):a; } 2.最小公倍数(LCM) 最小公