最大公約數:即兩個整數的最大公約數是可以同時整除它們的最大的正整算法
數。
任意輸入兩個數m,n 求最大公約數ide
下面進行三種求法的計算和比較:
法1:窮舉法:從兩個數裏找最小的數,從其開始進行循環,直到找到最大公約數。code
程序代碼:數學
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main(){ int m, n, i,t; scanf("%d%d", &m,&n); if (m < n) { t = m; m = n; m = t; } for (i = n; i >= 2; i--) { if (m%i == 0 && n%i == 0) break; } if (i != 1) printf("最大公約數爲:%d\n", i); else printf("無最大公約數"); system (「pause」); return 0; }
法2:分解質因數法:
找出兩個數中相同的質因子,這些相同的質因子累乘即爲最大公約數。
程序代碼:it
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main(){ int m, n, i; int s = 1; scanf("%d%d", &m, &n); if (m < n) { m = n - m; n = n - m; m = n + m; } for (i = 2; i <= n; i++) { while (m%i == 0 && n%i == 0) { s = s*i; m = m / i; n = n / i; } } printf("最大公約數爲:%d", s); system("pause"); return 0; }
法3.展轉相除法:(引用百度的一段講解,很清晰)io
展轉相除法基於以下原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。例如,252和105的最大公約數是21(252 = 21 × 12;105 = 21 × 5);由於252 − 105 = 21 × (12 − 5) = 147,因此147和105的最大公約數也是21。在這個過程當中,較大的數縮小了,因此繼續進行一樣的計算能夠不斷縮小這兩個數直至其中一個變成零。這時,所剩下的尚未變成零的數就是兩數的最大公約數。由展轉相除法也能夠推出,兩數的最大公約數能夠用兩數的整數倍相加來表示,如21 = 5 × 105 + (−2) × 252。class
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main(){ int m=2,n=3; int r; scanf("%d%d",&m,&n); /* if (m < n) { m = n - m; n = n - m; m = n + m; } */ //能夠不要!!!下面會本身換,能夠舉例子 while (n) { r = m%n; m = n; n = r; } printf("%d",m); system("pause"); return 0; }
算法比較:前兩種時間效率不高,展轉相除法是很重要的一門算法,不只節省了時間,還簡化了代碼。效率
最小公倍數:兩個整數的最小公倍數是兩個數可以同時被整除的最小的正整數。任意輸入兩個數m,n 求最小公倍數。基礎
法1.
質因數分解:一個數乘於另一個數中和本身不同的質因數
程序代碼:原理
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int m,n,i,result; scanf("%d%d",&m,&n); //較小的數*另一個數和本身不同的因數 result=n; //較小的數 for(i=2;i<=n;i++) {while(m%i==0&&n%i==0) //找不同的因數 {m=m/i; n=n/i; } } result=m*result; //相* printf("%d\n",result); system("pause"); return 0; }
法2.
有基礎知識可知:兩個數的乘積=最大公約數乘最小公倍數,所以可由最大公約數來求最小公倍數。
程序代碼
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int m,n,i,j,r,result; scanf("%d%d",&m,&n); i=m; j=n; //找最小公約數 while(n) { r=m%n; m=n; n=r; } //最大公倍數*最小公約數=原來兩數相乘 result=i*j/m; printf("%d\n",result); system("pause"); return 0; }
算法比較:法1是用很簡單的邏輯寫出來的,很好實現,但法2用數學知識減小了循環次數,需掌握。