例题(最大公约数)
题目描述
写两个函数,分别求两个整数的最大公约数和最小公倍数。用主函数分别调用这两个函数,并输出结果。
前置代码:
#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));
}
(详细分析请见作者倒数第二篇博客)