⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gcdpnumber.htm

📁 “常见程式演算”主要收集一些常见的程式练习题目
💻 HTM
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>



  
  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">



  
  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">



  
  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">



  
  
  
  <title>最大公因数、最小公倍数、因式分解</title>
</head>


<body>



<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>



<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 最大公因数、最小公倍数、因式分解</a></h1>



<h2>说明</h2>
最大公因数使用辗转相除法来求,最小公倍数则由这个公式来求:<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">GCD * LCM = 两数乘积</span><br>
</div>
<h2>解法</h2>
最大公因数可以使用递回与非递回求解,因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法就是求出小于该数的所有质数,并试试看是不是可以整除,求质数的问题是另一个课题,请参考 <a href="EratosthenesPrime.htm">Eratosthenes 筛选求质数</a>。<br>



<br>
<h2> 实作(最大公因数、最小公倍数)</h2>

<ul>
  <li> C
  </li>
</ul>

<pre>#include &lt;stdio.h&gt; <br>#include &lt;stdlib.h&gt; <br><br>int main(void) { <br>    int m, n, r; <br>    int s;<br><br>    printf("输入两数:"); <br>    scanf("%d %d", &amp;m, &amp;n); <br>    s = m * n;<br><br>    while(n != 0) { <br>        r = m % n; <br>        m = n; <br>        n = r; <br>    } <br><br>    printf("GCD:%d\n", m); <br>    printf("LCM:%d\n", s/m); <br><br>    return 0; <br>} <br></pre>

<br>

<ul>
  <li> Java
  </li>
</ul>

<pre>public class GcdLcm {<br>    public static int gcdOf(int m, int n) {<br>        int r;<br>        <br>        while(n != 0) { <br>            r = m % n; <br>            m = n; <br>            n = r; <br>        }<br>        <br>        return m;<br>    }<br>    <br>    public static int lcmOf(int m, int n) {<br>        return m * n / gcdOf(m, n);<br>    }<br>    <br>    public static void main(String[] args) {<br>        System.out.println("GCD of (10, 4) = " + <br>                              GcdLcm.gcdOf(10, 4));<br>        System.out.println("LCM of (10, 4) = " + <br>                              GcdLcm.lcmOf(10, 4));<br>    }<br>} <br></pre>


<h2> 实作(因式分解)</h2>

<ul>
  <li> C(不用质数表)
  </li>
</ul>

<pre>#include &lt;stdio.h&gt; <br>#include &lt;stdlib.h&gt; <br><br>int main(void) { <br>    int i, n; <br><br>    printf("请输入整数:"); <br>    scanf("%d", &amp;n); <br>    printf("%d = ", n); <br><br>    for(i = 2; i * i &lt;= n;) { <br>        if(n % i == 0) { <br>            printf("%d * ", i); <br>            n /= i; <br>        } <br>        else <br>            i++; <br>    } <br><br>    printf("%d\n", n); <br><br>    return 0; <br>} <br></pre>

<br>

<ul>
  <li> C(使用质数表)
  </li>
</ul>

<pre>#include &lt;stdio.h&gt; <br>#include &lt;stdlib.h&gt; <br><br>#define N 1000 <br><br>int prime(int*);  // 求质数表 <br>void factor(int*, int);  // 求factor <br><br>int main(void) { <br>    int ptable[N+1] = {0}; <br>    int count, i, temp; <br><br>    count = prime(ptable); <br><br>    printf("请输入一数:"); <br>    scanf("%d", &amp;temp); <br>    factor(ptable, temp); <br><br>    printf("\n"); <br><br>    return 0; <br> } <br><br> int prime(int* pNum) { <br>    int i, j; <br>    int prime[N+1]; <br><br>    for(i = 2; i &lt;= N; i++) <br>        prime[i] = 1; <br><br>    for(i = 2; i*i &lt;= N; i++) { <br>        if(prime[i] == 1) { <br>            for(j = 2*i; j &lt;= N; j++) { <br>                if(j % i == 0) <br>                    prime[j] = 0; <br>            } <br>        } <br>    } <br><br>    for(i = 2, j = 0; i &lt; N; i++) { <br>        if(prime[i] == 1) <br>            pNum[j++] = i; <br>    } <br><br>    return j; <br>} <br><br>void factor(int* table, int num) { <br>    int i; <br><br>    for(i = 0; table[i] * table[i] &lt;= num;) { <br>        if(num % table[i] == 0) { <br>            printf("%d * ", table[i]); <br>            num /= table[i]; <br>        } <br>        else <br>            i++; <br>    } <br><br>    printf("%d\n", num); <br>}<br> <br></pre>

<br>

<ul>
  <li> Java(使用质数表)
  </li>
</ul>

<pre>import java.util.ArrayList;<br><br>public class Factor {<br>    public static int[] factor(int num) {<br>        int[] pNum = Prime.findPrimes(num);<br>        <br>        ArrayList list = new ArrayList();<br>        <br>        for(int i = 0; pNum[i] * pNum[i] &lt;= num;) { <br>            if(num % pNum[i] == 0) { <br>                list.add(new Integer(pNum[i]));<br>                num /= pNum[i]; <br>            } <br>            else <br>                i++; <br>        } <br><br>        list.add(new Integer(num));<br>        <br>        int[] f = new int[list.size()];<br>        Object[] objs = list.toArray();<br>        for(int i = 0; i &lt; f.length; i++) {<br>            f[i] = ((Integer) objs[i]).intValue();<br>        }<br>        <br>        return f;<br>    }<br>    <br>    public static void main(String[] args) {<br>        int[] f = Factor.factor(100);<br>        for(int i = 0; i &lt; f.length; i++) {<br>            System.out.print(f[i] + " ");<br>        }<br>        System.out.println();<br>    }<br>}</pre>
<br>



</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -