1. 程式人生 > >常見演算法:C語言求最小公倍數和最大公約數三種演算法

常見演算法:C語言求最小公倍數和最大公約數三種演算法

最小公倍數:數論中的一種概念,兩個整數公有的倍數成為他們的公倍數,其中一個最小的公倍數是他們的最小公倍數,同樣地,若干個整數公有的倍數中最小的正整數稱為它們的最小公倍數,維基百科:定義點選開啟連結

求最小公倍數演算法

最小公倍數=兩整數的乘積÷最大公約數

求最大公約數演算法

(1)輾轉相除法

有兩整數ab

a%b得餘數c

c=0,則b即為兩數的最大公約數

③ 若c≠0,則a=bb=c,再回去執行①

例如求2715的最大公約數過程為:

27÷15 1215÷12312÷30因此,3即為最大公約數

#include<stdio.h>
void main()   /*  輾轉相除法求最大公約數 */ 
{ 
   int m, n, a, b, t, c;
   printf("Input two integer numbers:\n");
   scanf("%d%d", &a, &b);
   m=a;   n=b;
   while(b!=0)  /* 餘數不為0,繼續相除,直到餘數為0 */ 
   { c=a%b; a=b;  b=c;}
   printf("The largest common divisor:%d\n", a);
   printf("The least common multiple:%d\n", m*n/a);
}

⑵ 相減法

有兩整數a和b:

① 若a>b,則a=a-b

② 若a<b,則b=b-a

③ 若a=b,則a(或b)即為兩數的最大公約數

④ 若a≠b,則再回去執行①

例如求27和15的最大公約數過程為:

27-15=12( 15>12 ) 15-12=3( 12>3 )

12-3=9( 9>3 ) 9-3=6( 6>3 )

6-3=3( 3==3 )

因此,3即為最大公約數

#include<stdio.h>
void main ( )  /* 相減法求最大公約數 */
{  
   int m, n, a, b, c;
   printf("Input two integer numbers:\n");
   scanf ("%d,%d", &a, &b);m=a; n=b; 
     /* a, b不相等,大數減小數,直到相等為止。*/ 
   while ( a!=b) 
         if (a>b)  a=a-b;     
		 else  b=b-a;
   printf("The largest common divisor:%d\n", a);
   printf("The least common multiple:%d\n", m*n/a);
}

⑶窮舉法

有兩整數a和b:

① i=1

② 若a,b能同時被i整除,則t=i

③ i++

④ 若 i <= a(或b),則再回去執行②

⑤ 若 i > a(或b),則t即為最大公約數,結束

改進:

① i= a(或b)

② 若a,b能同時被i整除,則i即為最大公約數,

結束

③ i--,再回去執行②

有兩整數a和b:

① i=1

② 若a,b能同時被i整除,則t=i

③ i++

④ 若 i <= a(或b),則再回去執行②

⑤ 若 i > a(或b),則t即為最大公約數,結束

改進:

① i= a(或b)

② 若a,b能同時被i整除,則i即為最大公約數,

結束

③ i--,再回去執行②

#include<stdio.h>
void main ()  /* 窮舉法求最大公約數 */
{  
   int  m, n, a, b, i, t;
   printf("Input two integer numbers:\n");
   scanf ("%d,%d", &a, &b);m=a;  n=b; 
   for (i=1; i<= a; i++)  
       if ( a%i == 0 && b%i ==0 )    t=i;
   printf("The largest common divisor:%d\n", t);
   printf("The least common multiple:%d\n", m*n/t);
} 
/*  改進後的
   for (t= a; t>0; t-- )    
       if ( a%t == 0 && b%t ==0 )    break; 
*/

//窮舉法求最小公倍數
     for (i= a; ; i++ )
         if ( i % a == 0 && i % b ==0 )     break;
     printf("The least common multiple:%d\n", i )
 
//多個數的最大公約數和最小公倍數
     for (i= a; i>0; i-- )
         if (a%i==0&&b%i==0&&c%i==0)     break;
     printf("The largest common divisor:%d\n", i);
     for (i= a; ; i++ )
         if (i%a==0&&i%b==0&&i% c==0)    break;
     printf("The least common multiple:%d\n", i )