本文介绍两种不同方法来求:暴力、辗转相除法
从原理逐步分析,免费内容,建议先收藏
最大公约数肯定是小于或等于2数之间最小的那个数
最小公倍数肯定是大于或等于2数之间最大的那个数
所以弄清楚两数之间的大小关系显得尤为重要这也是在进行操作时,一般要包含的步骤
两者之间拥有着共同的计算方法,都是能整除或者被整除最大公因数或最小公倍数
所谓暴力求法就是通过循环寻找同时满足条件的数
原代码 :
#include <stdio.h>
//暴力求解最大公约数,没什么技巧
int dgy(int x,int y){
? ? if(y>x){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //交换大小,知道x,y的大小这点还蛮重要的
? ? ? ? int temp=x;
? ? ? ? x=y;
? ? ? ? y=temp;
? ? }
? ? for(int i=y;i>0;i--){
? ? ? ? if(x%i==0&&y%i==0)return i; ? ? ? ? ? ? ? ? ? ?//满足比两数小同时能被两数整除的最大数
? ? }return 0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //这里也可以用逗号表达式求x,y小的数
}
对于最小公倍数,我们可以用最大公倍数来公式求
当然也可以用同样的思路暴力求解
//最小公倍数一般用公式,当然也可以暴力和上面差不多
int xgb(int x,int y){
? ? return x*y/dgy(x, y);
}
//不厌其烦地给大家写一遍暴力求最小公倍数
int xgbq(int x,int y){
? ? if(y>x){
? ? ? ? int temp=x;
? ? ? ? x=y;
? ? ? ? y=temp;
? ? }
? ? for(int i=x;;i++){
? ? ? ? if(i%x==0&&i%y==0)return i;
? ? }
? ? return 0;
}
用辗转相除法我一般喜欢用递归总之就是简洁,特别适合算法竞赛
注意这里的X Y和上面的X Y的大小顺序是不一样的,只需要记住用大除小
原代码:
//家人们,辗转相除法必会求最大公约数
//这边推荐和递归一起用
int dgyq(int x,int y){
? ? if(y>x){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //常规交换
? ? ? ? int temp=x;
? ? ? ? x=y;
? ? ? ? y=temp;
? ? }
? ? return x?dgyq(y%x,x):y; ? ? ? ? ? ? ? //家人们结束了
}
int main(int argc, const char * argv[]) {
? ? int a,b;
? ? scanf("%d%d",&a,&b);
? ? printf("最大公约数为%d\n",dgyq(a,b));
}
好了,今天的分享就到这里结束了,欢迎大家留言积极讨论,我们一起进步,一起加油👏