最大公约数:即两个整数的最大公约数是能够同时整除它们的最大的正整
数。
任意输入两个数m,n 求最大公约数
下面进行三种求法的计算和比较:
法1:穷举法:从两个数里找最小的数,从其开始进行循环,直到找到最大公约数。
程序代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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:分解质因数法:
找出两个数中相同的质因子,这些相同的质因子累乘即为最大公约数。
程序代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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.辗转相除法:(引用百度的一段讲解,很清晰)
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 21 × (12 − 5) = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (−2) × 252。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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
#include
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
#include
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用数学知识减少了循环次数,需掌握。