最大公約數和最小公倍數
阿新 • • 發佈:2017-05-06
描述 出現 mage 最大公約數 images code ger return ges
一、問題描述
從鍵盤輸入兩個正整數a和b,求其最大公約數和最小公倍數。
二、算法思想及代碼
求最小公倍數算法:最小公倍數=兩整數的乘積÷最大公約數
求最大公約數算法:
(1)輾轉相除法
用較大的數除以較小的數,再用除數除以出現的余數(第一余數),接著,再用第一余數除以出現的第二余數,如此反復,直到余數為0為止,最後的除數就是這兩個數的最大公約數。有兩整數a和b:
① a%b得余數c
② 若c=0,則b即為兩數的最大公約數
③ 若c≠0,則a=b,b=c,再回去執行①
例如求27和15的最大公約數過程為: 27÷15 余12,15÷12余3,12÷3余0,因此,3即為最大公約數。
#include <stdio.h> intmain(){ int m,n,r,s; while(true){ printf("input 2 integers(m n): ") ; scanf("%d %d", &m, &n); if(m==0 || n==0) break; if(m<n){//保證m是較大的數 s=m; m=n; n=s; } s=m*n;//保留乘積用於求最小公倍數r=m%n; while(r!=0){ m=n; n=r; r=m%n; } //註意,最終的公約數是最後一次的除數,最後一次的余數肯定為0 printf("最大公約數:%d\n", n);//最大公約數 printf("最小公倍數:%d\n\n", s/n);//最小公倍數 } return 0; }
(2)相減法
有兩整數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>
int main(){ int m,n,s; while(true){ printf("input 2 integers(m n): ") ; scanf("%d %d", &m, &n); if(m==0 || n==0) break; s=m*n;//保留乘積用於求最小公倍數 while(m!=n){ if(m>n) m=m-n; else n=n-m; } printf("最大公約數:%d\n", n);//最大公約數 printf("最小公倍數:%d\n\n", s/n);//最小公倍數 } return 0; }
(3)窮舉法
有兩整數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> #include <stdlib.h> #define N 100 int gcd(int m, int n){ int i, k; for(i=2; i <= n; i++) { if(m%i==0 && n%i==0){ k = i;//保存當前的約數 continue; } } if(k<=n && k>1) return k; else return 1; } int lcm(int m, int n){ int t = gcd(m,n); return m*n/t; } int main(){ int m, n, t; while(true){ printf("input 2 integers(m n): "); scanf("%d %d", &m, &n); if(m==0 && n==0) break; if(m < n){//保證m是較大的那個數 t = m; m = n; n = t; } printf("最大公約數:%d\n",gcd(m,n));//求最大公約數 printf("最小公倍數:%d\n\n",lcm(m,n));//求最小公倍數 } }
#include <stdio.h> int gcd(int m, int n){ int i, k; for(i=m; i >= 2; i--) { if(m%i==0 && n%i==0){ return i; } } return 1; } int lcm(int m, int n){ int t = gcd(m,n); return m*n/t; } int main(){ int m,n,s,t; while(true){ printf("input 2 integers(m n): "); scanf("%d %d", &m, &n); if(m==0 && n==0) break; printf("最大公約數:%d\n",gcd(m,n));//求最大公約數 printf("最小公倍數:%d\n\n",lcm(m,n));//求最小公倍數 } return 0; }
//求最小公倍數的程序:最大公約數可以用兩個數的求法遞歸實現,也可以先求出所有公約數,再比較得出最大值。 #include <iostream> using namespace std; int main() { int a[5]={46,252,198,2366,3188}; int i,n; for(n=1;;n++) { i=n*3188; if((i%46==0)&&(i%252==0)&&(i%198==0)&&(i%2366==0)) { cout<<"最小公倍數是:"<<i;break; } } cin.get(); return 0; }
三、求多個數的最大公約數和最小公倍數
#include <stdio.h> /* 最大公約數 */ int gcd(int a, int b) { int t; if(a < b) { t = a; a = b; b = t; } if(b == 0) return a; return gcd(b, a % b); } /* 最小公倍數 */ int lcm(int a, int b) { return a * b / gcd(a, b); } int main(void) { int n, data[100], g, l; int i; printf("數據總數為:"); scanf("%d", &n); for(i = 0; i < n; ++i) { scanf("%d", &data[i]); } g = data[0]; for(i = 1; i < n; ++i) g = gcd(g, data[i]); l = 1; for(i = 0; i < n; ++i) l *= data[i] / g; //將每個數除以最大公約數,然後相乘 l *= g;//最後再乘以最大公約數 printf("最大公約數 = %d\n", g); printf("最小公倍數 = %d\n", l); return 0; }
最大公約數和最小公倍數