码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-29 21:48:36      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:最大   一个   理解   print   公约数   辗转相除法   color   pre   body   

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);
} 
    

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

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

标签:最大   一个   理解   print   公约数   辗转相除法   color   pre   body   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!