最大公约数与最小公倍数(c语言,详细)

一、最小公倍数(LCM)

最小公倍数=输入的两个数之积除于它们的最大公约数(a*b/最大公约数),关键是求出最大公约数;

二、最大公约数(GCD)

1.辗转相除法/欧几里得算法

定义:先用较大的数除以较小的数,算出余数。然后用除数继续除以余数,求出新的余数。接着再用除数除以余数…不停循环…直至余数为0,最终b就是最大公约数。示例(a=1997,b=615):

a b a mod b
1997 615 152 1997/615=3…152
615 152 7 615/152=4…7
152 7 5 152/7=21…5
7 5 2 7/5=1…2
5 2 1 5/2=2…1
2 1 0 2/1=2…0

1.1常规

#include
int main(){
	int a,b;
	printf("请输入a,b的值:");
	scanf("%d %d",&a,&b);
	if(a<b){  //交换a,b 的大小 
		int temp = b;
		b = a;
		a = temp;
	}
	int r;  //r代表余数
	r = a%b;
	int n;
	n = a*b; //最小公倍数为a*b/GCD 
	while(r!=0){
		a = b;
		b = r;
		r = a%b;
	}
	printf("最大公约数是%d,最小公倍数为%d",b,n/b);
	return 0;
}

1.2递归

#include
//递归实现最大公约数 
int gcd(int a,int b){
	if(a%b == 0)
		return b;
	else
		return gcd(b,a%b);
}
int main(){
	int a,b;
	printf("请输入a,b的值:");
	scanf("%d %d",&a,&b);
	if(a<b){  //交换a,b 的大小 
		int temp = b;
		b = a;
		a = temp;
	}
	int n;
	n = a*b; //最小公倍数为a*b/GCD 
	printf("最大公约数是%d,最小公倍数为%d",gcd(a,b),n/gcd(a,b));
	return 0;
}

2.更相减损术

更相减损法出自《九章算术》:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
具体方法:
第一步:任意给定两个正整数;若都是2偶数,则用2约简;否则,执行第二步。
第二步:两个数之间大的数字减小的数字,之后将得到的差与较小的数比较,并以大数减小数,一直循环,直到减数与所得的差相同,此时的差即为两个数之间的最大公约数。
第三步:得出来的差和约去的2的乘机就是最大公约数
示例(a=12,b=6)
第一步:约简为6,3(约减1次);
第二步:

a b a-b
6 3 6-3=3

第三步:3*2=6(gcd);

2.1常规

#include
int main(){
	int a,b;
	int x;       //两数之差
	printf("请输入a,b的值:");
	scanf("%d %d",&a,&b);
	int n = a*b; //两数之积
	int i=0;     //记录约去2的个数
	while(a%2==0 && b%2==0){
		a/=2;
		b/=2;
		i++;
	}
	if(a<b){
		int temp=b;
		b = a;
		a = temp;
	}
	x = a-b;
	while(x!=b){
		a = x>b?x:b;
		b = x<b?x:b;
		x = a-b;
	}
	if(i==0) 
		printf("最大公约数为%d,最小公倍数为%d",x,n/x);
	else{
		for(int j=0; j<i; j++){
			x = x*2;
		}
		printf("最大公约数为%d,最小公倍数为%d",x,n/x);
	}
	return 0;
}

2.2递归

#include
//递归 
int gcd(int a,int b){
	if(b == a-b) 
		return b;
	else
		return gcd(a-b>b?a-b:b,a-b<b?a-b:b);
} 
int main(){
	int a,b;
	printf("请输入a,b的值:");
	scanf("%d %d",&a,&b);
	int n = a*b; //两数之积
	int i=0;     //记录约去2的个数
	while(a%2==0 && b%2==0){
		a/=2;
		b/=2;
		i++;
	}
	if(a<b){
		int temp=b;
		b = a;
		a = temp;
	}
	if(i==0) 
		printf("最大公约数为%d,最小公倍数为%d",gcd(a,b),n/gcd(a,b));
	else{
		int x = gcd(a,b);
		for(int j=0; j<i; j++){
			x = x*2;
		}
		printf("最大公约数为%d,最小公倍数为%d",x,n/x);
	}
	return 0;
}

3.穷举法/暴力法

【最大公约数】:对于两个不同的正整数a,b,在[1,min{a,b}]中存在能同时被a和b所整除的数字,其中最大的数字就是最大公约数。
【最小公倍数】:对于两个不同的正整数a,b,从max{a,b}开始,找到的第一个能够整除a和b的数字,即为最小公倍数。

#include
//穷举实现最大公因数 
int gcd(int a,int b){
	int temp;
	int max=1; //公因数中最大的 
	if(a<b){
		temp = a;
		a = b;
		b = temp;
	}
	for(int i=1; i<=b; i++){
		if(a%i==0 && b%i==0)
			max = i;
	}
	return max;
}

//穷尽实现最小公倍数
int lcm(int a,int b){
	int max;  //a和b之中较大的数
	max = a>b?a:b;
	int i;
	for(i=max; ; i++){
		if(i%a==0 && i%b==0)
			break;
	}
	return i; 
} 

int main(){
	int a,b;
	printf("请输入a,b的值:");
	scanf("%d %d",&a,&b);
	printf("最大公约数为%d,最小公倍数为%d",gcd(a,b),lcm(a,b));
}

你可能感兴趣的:(c语言,算法,开发语言)