很经典的一道题,我们来直接看题目
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数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,则此时的除数就是最大公因数