花式求解最大公约数(补充)(c语言)

例题(最大公约数)

题目描述

写两个函数,分别求两个整数的最大公约数和最小公倍数。用主函数分别调用这两个函数,并输出结果。

前置代码:

#include <stdio.h>
int max(int a,int b);
int min(int a,int b);
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d %d\n",max(a,b),min(a,b));
}

输入描述

两个用空格隔开的正整数,保证二者的值均不超过10000。

输出描述

输出两个正整数的最大公约数和最小公倍数,用空格隔开。
请注意行尾输出换行。

样例输入

24 10
样例输出

2 120

解法一:递归

#include <stdio.h>
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("%d %d\n",max(a,b),min(a,b));
 }
 
int max(int m,int n)
{
    if(n<=m&&m%n==0)
        return n;
    else
        return max(n,m%n);
}
int min(int m,int n)
{
    return (m*n)/max(m,n);
}

解法二:辗转相除

#include <stdio.h>
int max(int a,int b)
{
    int r;
    r=a%b;
    while(r!=0)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}
int min(int a,int b)
{
    int c;
    c=max(a,b);
    return a*b/c;
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("%d %d\n",max(a,b),min(a,b));
 }

解法三:辗转相减

#include <stdio.h>
int max(int a,int b)
{
    int t,i,k;
    while(a!=b)
    {
    	if(a>b)
    	a=a-b;
    	else
    	b=b-a;
	}
	return a;
}
int min(int a,int b)
{
    return a*b/max(a,b);
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("%d %d\n",max(a,b),min(a,b));
 }

解法四:从小到大穷举

#include <stdio.h>
int max(int a,int b)
{
    int t,i,k;
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    for(i=1;i<=b;i++)
    {
        if(a%i==0&&b%i==0)
        k=i;
    }
    return k;
}
int min(int a,int b)
{
    return a*b/max(a,b);
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("%d %d\n",max(a,b),min(a,b));
 }

解法五:从大到小穷举

#include <stdio.h>
int max(int a,int b)
{
    int t;
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    for(t=b;a%t!=0||b%t!=0;t--);
    return t;
}
int min(int a,int b)
{
    return a*b/max(a,b);
}
int main()
{
   int a,b;
   scanf("%d %d",&a,&b);
   printf("%d %d\n",max(a,b),min(a,b));
 }

(详细分析请见作者倒数第二篇博客)
在这里插入图片描述

发布了17 篇原创文章 · 获赞 15 · 访问量 547

猜你喜欢

转载自blog.csdn.net/qq_46009744/article/details/104406493