求最小公倍數的算法:
最小公倍數=兩整數的乘積÷最大公約數 。 所以該問題可以轉化為求最大公約數的算法。
求最大公約數的四種算法:
1. 輾轉相除法 :
- a%b得余數c
- 如果c = 0,則b為最大公約數
- 如果c不等於0,則a = b,b = c繼續執行步驟1。
#include<stdio.h>
int 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);
}
還有一種簡寫方式:
int gcd(int a,int b)
{
if (b==0)
return a;
return gcd(b, a%b);
}
2. 相減法:
- 若a>b,則a=a-b
- 若a < b,則b=b-a
- 若a=b,則a(或b)即為兩數的最大公約數
- 若a≠b,則再回去執行1
#include<stdio.h>
int 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);
}
4.枚舉法:
已知1是一個公約數,但是1不是最大公約數,所以可以檢測K=2,3,4…..是否為n1和n2的公約數,直到k大於n1或者n2。將公約數存儲在gcd的變量中,gcd初值設為1
int gcd = 1;
for(int k = 2;k <= n1&&k <= n2;k++){
if(n1 % k == 0&& n2 % k == 0)
gcd = k;
}