最大公约数和最小公倍数 (10分)(三种方法)(辗转相除法和辗转相减法)

很经典的一道题,我们来直接看题目
本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

此题的解法有暴力,辗转相除,辗转相减三种
这里为了简洁,我只介绍后两种。

第一种:辗转相减:
首先,上个百度百科:辗转相减法(求最大公约数),即尼考曼彻斯法,其特色是做一系列减法,从而求得最大公约数。例如 :两个自然数35和14,用大数减去小数,(35,14)->(21,14)->(7,14),此时,7小于14,要做一次交换,把14作为被减数,即(14,7)->(7,7),再做一次相减,结果为0,这样也就求出了最大公约数7
完了,文字很多看不懂不想看,咋办?
简单,我来告诉你思路:
先比较两数字大小,得出大的数和小的数
第二步:大数=大数-小数(大数此时已经更新了)
第三步:再次比较两数字大小,得出大的数和小的数
第四步:大数=大数-小


直至结果相减结果为0时结束,
此时的两数字已经相等,这时的数字即是最大公约数

利用此思路我们解决下这题:

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int c=a,d=b;//由于后面a,b的值会变,所以要新建变量保留初值 
	while(1){
		if(a>b){
			a=a-b;//将两个数的差值赋给最大的一个
		}
		else if(b>a){
			b=b-a;
		}
		else{
			break; //相等就跳出
		}
	}
	printf("%d %d",a,c*d/a);
	return 0;
}

本方法注意点
①1.while(1)其中1代表一个常量表达式,它永远不会等于0。循环会一直执行下 去。除非你设置break等类似的跳出循环语句循环才会中止。
2.while(i–)其中i一个变量,因此表达式i–有不同的值,依次递减,i–是先取值后减,–i先加减取值,所以i–的值同未执行该自减运算时的i相等。因此当i为0时,循环会跳出。
最小公倍数=原数字相乘/最大公因数

OK有了,辗转相减法的基础,辗转相除法就很好理解了。
直接上百度百科图
在这里插入图片描述
好的,大概意思是,不断拿除数去除余数,除到余数为0,就OK,
此时的除数就是最大公因数

直接上代码:

#include<stdio.h>
int main(){
	int x1,x2;
	int y1,y2,m;
	scanf("%d %d",&x1,&x2);
	y1=x1;
	y2=x2;//一样的道理先保留初值,为了算最小公倍数用
	m=y1%y2;
	while(m!=0){
		y1=y2;//除数变下一次的被除数
		y2=m;//余数变除数
		m=y1%y2;//取余数
	}
	printf("%d %d",y2,x1*x2/y2);
	
}

注意点
①注意最后一步是判断余数是否为0.
若为0,则此时的除数就是最大公因数

发布了10 篇原创文章 · 获赞 0 · 访问量 91

猜你喜欢

转载自blog.csdn.net/weixin_45734902/article/details/103973600