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

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

  • 相关阅读:
    Python---Flask--08--Flask-Ckeditor
    Python---Flask--07--SQLAlchemy基本关系
    Python---Flask--06--分页的实现
    Python---Flask--05--g对象和钩子函数
    maven项目管理构建
    POI 设置
    http状态码
    hibernate框架之-查询结果集返回类型
    Struts2框架之-注解开发
    Struts2框架之-Struts2的标签
  • 原文地址:https://www.cnblogs.com/Latticeeee/p/8146236.html
Copyright © 2020-2023  润新知