C语言练习第16题

前言

今天怎么就5月4日了!!!!

第十六题

题目:
输入两个正整数m和n,求其最大公约数和最小公倍数。

碎碎念:
自从回想起函数后,我觉得万物皆可用函数,这题用函数也简单。

我的思路:
2、输入:正整数m、n
输出:这两数的最大公约数和最小倍数。
3、分析:
最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数
求最大公约数用辗转相除法(又名欧几里德算法,我翻书看的)

第一步:a /b,令r为所得余数(0≤r )
第二步:互换:置 a←b,b←r,并返回第一步。

我的过程:
方法一:

#include<stdio.h>
int main()
{
    
    
    int a,b,t,r,n;
    printf("请输入两个数字:\n");
    scanf("%d %d",&a,&b);
    if(a<b)
    {
    
    t=b;b=a;a=t;}
    r=a%b;
    n=a*b;
    while(r!=0)
    {
    
    
        a=b;
        b=r;
        r=a%b;
    }
    printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);
    
    return 0;
}

方法二:用函数

#include<stdio.h>
void f14(int m,int n){
    
    
    int i=0;
    int num=1;
    int temp1=m,temp2=n;//用两个变量寄存m,n的值
    int min=m<n?m:n;//求得m,n中的较小值

    for(i=2;i<=min;i++){
    
    
        if((m%i==0)&&(n%i==0)){
    
    
            //printf("%d\n",i);
            num*=i;
            m=m/i;
            n=n/i;
            min=min/i;
            i=1;//i的还原,不然在执行一次循环体后,i++=3,下次循环时,会将i=2这个商给跳过,出现问题
            //printf("%d\n",min);
        }
    }
    printf("最大公约数为:%d\n",num);
    printf("最小公倍数为:%d\n",temp1*temp2/num);
}
int main(){
    
    
        printf("请输入两个数:");
    int m,n;
    scanf(" %d %d",&m,&n);
    f14(m,n);
        return 0;
}

方法三:辗转相除法(我看懂了)

#include<stdio.h>
#include<math.h>

int main()
{
    
    
    int a,b,n,t,j;
    printf("输入2个正整数:");
    scanf("%d%d",&a,&b);
    if(a<b)
    {
    
    
        t=a;
        a=b;
        b=t;
    }
    n=a%b;
    j=a*b;
    while(n!=0)
    {
    
    
        a=b;
        b=n;
        n=a%b;
    }
    printf("%d是最大公约数\n",b);
    printf("%d是最小公倍数\n",j/b);
}

运行结果:
在这里插入图片描述
总结
感觉越来越上手了。方法也从最开始的一种能写出第二种了

猜你喜欢

转载自blog.csdn.net/weixin_52248428/article/details/116457347