您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-07 17:10 423 查看
这里列出三种求最大公约数的方法,用公式法就最小公倍数。

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

质因数分解法:

最大公约数:

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

例如:求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 <stdio.h>
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
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
例如求27和15的最大公约数过程为:
27-15=12  ( 15>12 )  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<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
*/
//④ 若a≠b,则再回去执行①
    while(n1!=n2)
    {
        if(n1 > n2)//① 若a>b,则a=a-b
            n1 -= n2;
        else
            n2 -= n1;//② 若a<b,则b=b-a
    }
    return n1;//若a=b,则a(或b)即为两数的最大公约数
}
/*
辗转相除法
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
例如求27和15的最大公约数过程为:
27÷15 余1215÷12余312÷3余0因此,3即为最大公约数
*/
//辗转相除法:使用递归
static int GCD2(int a,int b)
{
    int c=0;
    c=a%b;//① a%b得余数c
    if(c==0)
        return b;//② 若c=0,则b即为两数的最大公约数
    else
    {
//        ③ 若c≠0,则a=b,b=c,再回去执行①
        a=b;
        b=c;
        GCD(a,b);
    }
}
/*
辗转相除法
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
例如求27和15的最大公约数过程为:
27÷15 余1215÷12余312÷3余0因此,3即为最大公约数
*/
//辗转相除法,非递归
int GCD22(int a, int b)
{
    int c;
    if(a<b)  // 取a,b中较大的一个数,a中存放较大的数,b中存放较小的数
    {
    // 不通过引入中间变量,通过异或运算来交换两个数的值
        a = a^b;
        b = a^b;
        a = a^b;
    }//保证a大于b
    c = a % b;  //① a%b得余数c
    while(c)//② 若c=0,则b即为两数的最大公约数
    {
        //③ 若c≠0,则a=b,b=c,再回去执行①
        a = b;
        b = c;
        c = a % b; //① a%b得余数c
    }
    return b;  //② 若c=0,则b即为两数的最大公约数
}
//分解质因数:
void printPrimeFactor(int n)//对数n分解质因数
{
    printf("分解质因数:%d=",n);
    int factor=2;//最小的质因数为2
    int flag=0;
    while (factor <= n)//合数大于等于因数
    {
        if (n % factor == 0)//刚开始是除以2这个质数,一直除到到没有2的质数因数为止
        {
            n = n / factor;//除以这个质数
            if(flag==0)//if/else语句只是为了不输出第一个乘号“*”
                flag=1;
            else
                printf("*");//输出乘号
            printf("%d",factor);//输出质因数
        }
        else
        {
            factor++;//质因数加一,
        }
    }
    printf("\n");
}


测试:

输出两个数(以空格分割):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
程序结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: