zoukankan      html  css  js  c++  java
  • C实现最大公约数和最小公倍数

    题目:C实现最大公约数和最小公倍数。

    分析:

          原文链接:http://www.baidu.com/p/csg974?from=zhidao

    反过来从已知两个整数思考,

    拿30和18举例,分解质因数,

    30=2*3*5

    18=2*3*3



    两者相同的部分是2*3,不同的部分是5和3。

    所谓的最大公约数,就是指的这个相同的部分,它同时被两个整数包含在内,是两个整数共同的约数,所以是公约数,而且是最大的那个,因为你把所有相同的部分都取出来了。

    所以30和18的最大公约数就是2*3=6。



    而最小公倍数是什么呢,是两个整数的共有的倍数,就是既能包括第一个整数,也能包括第二个整数。

    那么怎样包含呢?首先两者相同的部分2*3必须算上,然后要包含第一个整数,那就必须再算上两者不同的部分5,要包含第二个整数,就要包含第二个整数的那个不同的部分3。

    所以最小公倍数就是最大公约数(相同部分)*第一个数的不同部分*第二个数的不同部分。这样就可以被两个整数同时整除了。而且也是最小的公倍数,再比它少一点就不能被某个整数整除了。

    当然,两个整数相乘的话,也是公倍数,但这样相同部分就乘了2次,所以不是最小的。只有当两个整数最大公约数为1即互质的时候,就没有相同部分了,这时乘积就是最小公倍数。



    所以回头看你这个题目。

    最小公倍数÷最大公约数,结果就是算出两者不同的那部分。

    然后把这个不同的部分分成两部分的乘积,再分别乘到最大公约数上,

    就算出这两个整数。



    要注意的是,把那个不同部分分成两部分的时候,不要把同样的质因数分到两边。

    比如说不同的部分是3*5*5,那你就不能分成3*5和5,因为这样5就属于相同部分了,不属于不同部分,那样最大公约数和最小公倍数就变了,不可以的。

    只能分成1和3*5*5,3和5*5。总之让相同的质因数放在相同的一边就好。

    代码实现:

     1 #include<stdio.h>
     2 #include<math.h>
     3 void main()
     4 {
     5     int a;
     6     int n1,n2;
     7     int temp;
     8     int total;
     9     printf("input two number :");
    10     scanf("%d%d",&n1,&n2);
    11     total=n1*n2;
    12     if(n1<n2)
    13     {
    14         temp=n1;
    15         n1=n2;
    16         n2=temp;
    17     }
    18 
    19     while((a=(n1%n2)!=0))
    20     {
    21         n1=n2;
    22         n2=a;
    23     }
    24     printf("gcd=%d\n",n2);
    25     printf("lcm=%d\n",total/n2);
    26 
    27 
    28 
    29 }

    结果截图:

     

  • 相关阅读:
    字节顺序(大端小端)
    动态数组(一维二维)探秘
    算法十正则表达式匹配
    算法九回文数
    算法八字符串转换正数(atoi)
    windows server 2008配置多用户远程连接
    算法七整数反转
    原码反码补码
    算法六Z自形变换
    Java学习笔记之:Java Map集合
  • 原文地址:https://www.cnblogs.com/liji275137657/p/3120051.html
Copyright © 2011-2022 走看看