求两个数的最大公约数

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

这道题,首先,需要至少什么是约数?
它是指:约数,又称因数。整数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即为最大公约数,自己可以试着写一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值