最大公约数:即两个整数的最大公约数是可以同时整除它们的最大的正整算法
数。
任意输入两个数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用数学知识减小了循环次数,需掌握。