n个数的最大公约数和最小公倍数

Po主刚刚考完计算概论....心情低落...

好气啊..昨天看到这题了...今天还是脑子一团浆糊....TAT

总结一发,吸取教训!努力学习!!

//题目描述:

第一行输入,n

第二行输入n个数,输出这n个数的最大公约数和最小公倍数。

先求两个数的公因数。

辗转相除法原理:假设我们要求的是x和y的最大公约数(x>y),x可以表示为x=ay+b,那么x和y的公约数c也必能整除b,即x和y的公约数和y和b的公约数是相同的,若一直取除数和余数作为新的x和y,直到y是x的因数,此时y就是最大公约数(最大公约数不可能比两个数的最小数大)。//考试的时候就是这里有些没想清楚,光想着背代码了

int gys(int x,int y){
    int b;
    if(x<y){     //将大的数排在前面
        b=x;
        x=y;
        y=b;
    }
    while(x%y!=0){         //一直循环直到y是x的因数
        b=x%y;
        x=y;                     // 不断取除数 作为x
        y=b;                    //不断取余数 作为y
    }
    return y;                   //当y是x的因数时,y就是最大公因数
}

有了两个数的最大公因数,最小公倍数就好办了。

int gbs(int x,int y){
    int result=(x*y)/(gys(x,y));
    return result;
}

那怎么求n个数的最大公因数和最小公倍数呢?//这里我考试的时候也没想清楚...我好菜啊QAQ

这样子考虑,当n=1的时候,最大公因数和最小公倍数都是第一个数a;

当n=2的时候,最大公因数和最小公倍数是第一个数a和第二个数b的最大公因数x和最小公倍数y。

当n=3的时候,最小公倍数就是y和第三个数c的最小公倍数,这很好理解;那么最大公因数呢?就是x与c的最大公因数   //没想到啊当时脑子太乱了TAT

int main(){
int n;
scanf("%d",&n);
int i,x,y;
scanf("%d",&x);
int gyshu=x,gbshu=x;
for(i=1;i<n;i++){
    scanf("%d",&y);
    gyshu=gys(gyshu,y);
    gbshu=gbs(gbshu,y);
}
printf("%d %d",gyshu,gbshu);
} 

写完发现好简单啊!!!!

我的心在滴血!!!

欲哭无泪!!!

贴一个总代码:

#include <stdio.h>
#include <malloc.h>
 //碾除法 

int gys(int x,int y){
    int b;
    if(x<y){     //将大的数排在前面
        b=x;
        x=y;
        y=b;
    }
    while(x%y!=0){         //一直循环直到y是x的因数
        b=x%y;
        x=y;                     // 不断取除数 作为x
        y=b;                    //不断取余数 作为y
    }
    return y;                   //当y是x的因数时,y就是最大公因数
}

int gbs(int x,int y){
    int result=(x*y)/(gys(x,y));
    return result;
}    

int main(){
int n;
scanf("%d",&n);
int i,x,y;
scanf("%d",&x);
int gyshu=x,gbshu=x;
for(i=1;i<n;i++){
    scanf("%d",&y);
    gyshu=gys(gyshu,y);
    gbshu=gbs(gbshu,y);
}
printf("%d %d",gyshu,gbshu);
}
    

很难过了,但是还是要去复习集合论与图论,毕竟周二还要考试 :)。

原文地址:https://www.cnblogs.com/Latticeeee/p/8146236.html

时间: 2024-10-16 07:33:57

n个数的最大公约数和最小公倍数的相关文章

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

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

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

C程序设计第八章的第一道题目,求两个数的最大公约数和最小公倍数.需要注意一下几点: 1.最大公约数和最小公倍数间的关系: 设两个数是a,b最大公约数是p,最小公倍数是q 那么有这样的关系:ab=pq 所以q=ab/p.2.任意整数和0的公约数是该整数的所有约数,所以它们的最大公约数为该整数本身.3.碾转相除法:被除数%除数=余数,如果余数不为0,就让原来的除数做为被除数,余数作为除数,再进行运算 被除数%除数=余数,直到得到的余数为0为止,此时的除数就是最大公约数. #include <stdi

求N个数的最大公约数和最小公倍数

除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表示a1,a2,..,an的最大公约数,其中a1,a2,..,an为非负整数.对于两个数a,b,有[a,b]=ab/(a,b),因此两个数最小公倍数可以用其最大公约数计算.但对于多个数,并没有[a1,a2,..,an]=M/(a1,a2,..,an)成立,M为a1,a2,..,an的乘积.例如:[2,

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl

C语言之函数调用07—求4个数的最大公约数和最小公倍数

//函数调用 /* ========================================================== 题目:求4个数的最大公约数和最小公倍数. ========================================================== */ #include<stdio.h> long gys(long m,long n) { int t,r; if(m<n) {t=m;m=n;n=t;} while((r=m%n)!=0)

C语言之函数调用08—暴力法求4个数的最大公约数和最小公倍数

//数组枚举法 /* ========================================================== 题目:求4个数的最大公约数和最小公倍数. ========================================================== */ #include<stdio.h> #define N 4 main() { int a[N],gys,gbs; int i,j,m=1; int flag=1; printf("输

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

此处用的是最简单的遍历方法,先求出2个数的最小公倍数,再用两个数之积去除以最小公倍数就能够得到最大公约数. #include <iostream> #include <cmath> using namespace std; int main() { int a,b,c,d; cin>>a>>b; for(int i=a;;i++) { if(i%a==0 &&i%b==0) { c=i; break; } } d=a*b/c; cout<

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;

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

import java.util.Scanner; //求两个数的最大公约数,最小共倍数. public class CommonMaxDivisor { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int m=scanner.nextInt(); int n=scanner.nextInt(); scanner.close(); CommonMaxDivisor cmd=new