这里列出三种求最大公约数的方法,用公式法就最小公倍数。
以及通过分解质因数法,来验证结果。分解质因数法我没有写出来。
质因数分解法:
最大公约数:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24、60)=12。
最小公倍数:
把几个数先分别分解质因数,再把各数中的全部 公有的质因数 和 独有的质因数 提取出来连乘,
所得的积就是这几个数的最小公倍数。
例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
/**
求最大公约数的三种方法,穷举法,相减法,辗转相除法
公式法求最小公倍数:a*b/gcd(a,b)
*/
#include
int GCD(int,int);
static int GCD1(int n1,int n2);
static int GCD2(int a,int b);
int main()
{
int n1, n2;
int isEnd=1;
while(isEnd==1)
{
isEnd='n';
printf("输出两个数(以空格分割):");
scanf("%d %d",&n1,&n2);
printf("%d和%d的最大公约数为%d\n",n1,n2,GCD(n1,n2));
printf("%d和%d的最大公约数为%d\n",n1,n2,GCD1(n1,n2));
//辗转相除法:使用递归
printf("%d和%d的最大公约数为%d\n",n1,n2,GCD2(n1,n2));
printf("%d和%d的 最小公倍数为%d\n",n1,n2,n1*n2/GCD2(n1,n2));
//辗转相除法: 非递归
printf("%d和%d的最大公约数为%d\n",n1,n2,GCD22(n1,n2));
printf("%d和%d的 最小公倍数为%d\n",n1,n2,n1*n2/GCD22(n1,n2));
//通过分解质因数验证:
printPrimeFactor(n1);
printPrimeFactor(n2);
printf("继续[1/0]?:");
scanf("%d",&isEnd);
}
printf("程序结束!\n");
return 0;
}
//求最大公约数:穷举法
/*
穷举法1:
有两整数a和b:
① i=1
② 若a,b能同时被i整除,则gcd=i
③ i++
④ 若 i <= a(或b),则再回去执行②
⑤ 若 i > a(或b),则t即为最大公约数,结束
*/
int GCD(int n1,int n2)
{
int i;
int gcd=0;
for(i=1; i <= n1 && i <= n2; ++i)
{
// 判断 i 是否为最大公约数
if(n1%i==0 && n2%i==0)//如果能n1,n2同时除尽这个数
gcd = i;//那么这个数就是n1,n2的公约数,一遍循环之后就得到最大的公约数
}
return gcd;
}
/*
相减法:
有两整数a和b:
① 若a>b,则a=a-b
② 若a12 ) 15-12=3( 12>3 )
12-3=9 ( 9>3 ) 9-3=6( 6>3 )
6-3=3 ( 3==3 )
因此,3即为最大公约数
*/
static int GCD1(int n1,int n2)
{
/*
相减法:
有两整数a和b:
① 若a>b,则a=a-b
② 若a n2)//① 若a>b,则a=a-b
n1 -= n2;
else
n2 -= n1;//② 若a
测试:
输出两个数(以空格分割):12 68
12和68的最大公约数为4
12和68的最大公约数为4
12和68的最大公约数为4
12和68的 最小公倍数为204
12和68的最大公约数为4
12和68的 最小公倍数为204
分解质因数:12=2*2*3
分解质因数:68=2*2*17
继续[1/0]?:1
输出两个数(以空格分割):4 8
4和8的最大公约数为4
4和8的最大公约数为4
4和8的最大公约数为4
4和8的 最小公倍数为8
4和8的最大公约数为4
4和8的 最小公倍数为8
分解质因数:4=2*2
分解质因数:8=2*2*2
继续[1/0]?:1
输出两个数(以空格分割):23 14
23和14的最大公约数为1
23和14的最大公约数为1
23和14的最大公约数为1
23和14的 最小公倍数为322
23和14的最大公约数为1
23和14的 最小公倍数为322
分解质因数:23=23
分解质因数:14=2*7
继续[1/0]?:0
程序结束!