求两个数的最大公约数

时间:2022-02-06 00:34:29

题目:
求两个数的最大公约数

这道题,首先,需要至少什么是约数?
它是指:约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在大学之前,”约数”一词所指的一般只限于正约数。约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。
其实,需要知道什么是公约数?
它是指:公约数,亦称“公因数”。它是几个整数同时均能整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数(H.C.M. / G.C.D.) 求两个数最大公约数的方法 倍数关系 若较大数是较小数的倍数,那么较小数就是这两个数的最大公约数。 互质关系 若这两个数是互质数,那么它们的最大公约数就是1.
最后,需要就是我们的设计思路。

设计思路:
方法一:
我们可以采用学生(阙正仁)完成的方法,直接将每一个数的约数都找出来,然后在比较这个两个数的约数,取其最大的公约数,即可完成题目要求。
代码如下:

#include<stdio.h>

void main()
{
    int que(int k,int j);//函数定义
    int k,j,v;
    printf("请输入两个数:");
    scanf("%d%d",&k,&j);
    v=que(k,j);
    printf("\n最大公约数为:%d\n",v);

}
int que(int k,int j)
{ 
    int i,n,temp,a[50],b[50],d[50];//a[]存放第一个数约数 b[]存放第二个数约数 d[]存放公共约数


    int t=0;  //关于a[]
    int c=0;  //关于b[]
    int f=0;  //关于d[]
    int u=0;  //用于比较取最大约数
    //求出两个数的约数
    for(i=1;i<=j;i++)
    {
        if(j%i==0)
        {
            a[t]=i;//存在a[]
            t++;
        }       
    }

    printf("%d的约数为:",j);
    for(i=0;i<t;i++)
    {
        printf("%d ",a[i]);//输出a约数
    }

    for(i=1;i<=k;i++)
    {
        if(0==k%i)
        {
            b[c]=i;//存在b[]
            c++;
        }
    }

    printf("\n%d的约数为:",k);
    for(i=0;i<c;i++)
    {
        printf("%d ",b[i]);//输出b约数
    }

    //取出相同的约数

    if(c<t)
    {
        for(i=0;i<=c;i++)
        {
            for(n=0;n<t;n++)
            {
                if(a[i]==b[n])
                {
                    d[f]=a[i];
                    f++;
                }
            }
        }
    }
    else
    {
        for(n=0;n<=t;n++)
        {
            for(i=0;i<c;i++)
            {
                if(b[n]==a[i])
                {
                    d[f]=b[n];
                    f++;
                }
            }
        }
    }

    //输出相同的约数
    printf("\n相同的约数是:");
    for(i=0;i<f;i++)
    {
        printf("%d ",d[i]);
    }

    //求最大约数
    for(i=0;i<f;i++)
    {
        if(u<a[i])
        {
            temp=u;
            u=d[i];
            d[i]=temp;
        }
    }

    return u;

}

结果如下:
求两个数的最大公约数

这样就完成了,两个公约数的最大值提取,虽然的写的风格一般,但思路很清晰。

方法二:
可以直接将两个数放一起进行比较,每当找到一个因子时,就去判断是不是另外一个数的因子,直到找到最大的一个因子,这样能够简化代码,保证代码的简洁。
代码如下:

#include <stdio.h>

void main()
{
    int fun(int a, int b);
    int a,b; // 变量声明
    int Max_common_divisor;   // 最大公约数
    printf("请输入:");
    scanf("%d%d",&a,&b);        // 输入两个数
    Max_common_divisor=fun(a,b);    // 函数调用
    printf("最大公约数为:%d\n",Max_common_divisor);   // 输出最大公约数
}

int fun(int a, int b)
{
    int i;   // 循坏变量
    int temp;
    int max;  // 存放公约数
    if(a>b)  // 让a中存放两个数中的一个小数
    {
        temp = a;
        a = b; 
        b =temp;
    }
    for(i=1; i<=a; i++)
    {
        if(a%i==0)
        {
            if(b%i==0)
            {
                max = i;
            }
        }
    }

    return max;
}   

结果为:
求两个数的最大公约数
这样就较为简洁的完成了该题编码。

但这样的代码还是有改进和优化的地方,像for(i=1; i<=a; i++)可以改成for(i=1; i<=a/2; i++),但需要注意判断a本身是不是两个数的共同公约数,若是a即为最大公约数,自己可以试着写一下。