C 数据结构之最大公约数最小公倍数

最大公约数:若整数g为整数a,b的公约数,则g满足 a=g*l;  b=g*m; 其中l ,m为整数。

a=b*k+r。k为整数,r为a除以b后的余数。则g*l=g*m*k+r, r=g*(l-m*k);(g!=0)

因此,a,b的公约数可以整除a除以b剩余的余数,即a mod b。即a,b的公约数也是a mod b的公约数。若g是a,b的最大公约数,则g也是a,a mod b的最大公约数。

1.输入两个正整数,求最大公约数。

样例输入:49 14

样例输出:7

#include<stdio.h>
int gcd(int a,int b)
{
	if (b==0) return a;//若b为0,最大公约数为a 
	else return gcd(b,a%b);//否则,则改为求b与a%b的最大公约数 
}
int main()
{
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF)
	printf("%d\n",gcd(a,b));
	return 0;
}

最大公约数的非递归形式:

#include<stdio.h>
int gcd(int a,int b)
{
	while(b!=0)//只要b不为0 
	{
		int t=a%b;
		a=b;//使a变成b 
		b=t;//使b变成a%b 
	}
	return a;
}
	int main()
	{
		int a,b;
		while(scanf("%d%d",&a,&b)!=EOF)
		{
			printf("%d\n",gcd(a,b));
		}
		return 0;
	}

2.给定两个正整数,计算这两个数的最小公倍数

样例输入:10 14

样例输出:70 

思路:a,b的最小公倍数为俩数的乘积除以他们的最大公约数。证明如下:


#include<stdio.h>
int gcd(int a,int b)
{//求最大公约数 
	return b!=0 ? gcd(b,a%b):a;
} 
int main()
{
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		printf("%d\n",a*b/gcd(a,b));//输出两数乘积与最大公约数的商 
	}
}


猜你喜欢

转载自blog.csdn.net/joanna_or_zhouzhou/article/details/80355003