C语言 求最大公约数的三种方法,利用最大公约数求最小公倍数,通过分解质因数法来验证

这里列出三种求最大公约数的方法,用公式法就最小公倍数。

以及通过分解质因数法,来验证结果。分解质因数法我没有写出来。

质因数分解法:
最大公约数:
    把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。

例如:求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
程序结束!

你可能感兴趣的:(C语言 求最大公约数的三种方法,利用最大公约数求最小公倍数,通过分解质因数法来验证)