循环硬解

输入a,b两个值,定义一个数i,将a或b赋值i,用i同时对两数取余,两数都能除尽时,i即为最小公倍数,若余数不为零则i++

同理,定义一个数j,将j赋值为1,利用j++,如果a和b能同时除尽j,则求出最大公约数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int main()
{
int a,b,i,j;
int max=0;
scanf("%d%d",&a,&b);
for(i=a;;i++)//求最小公倍数
{
if(i%a==0&&i%b==0)//用大于等于a和b的数i(i大于等于a和b,无上限)分别除以a和b,同时除尽的第一个数即为最小公倍数
break;//然后循环结束
}

for(j=1;j<=a;j++)//求最大公约数
{
if(a%j==0&&b%j==0)//让a和b分别除以j(j从一开始,j有上限要小于等于a或b)

//利用j++,如果a和b能同时除尽j
{
if(max<j)//再判断j是不是小于a或b的最大公约数,不是则赋值最大值
max=j;//这样求出来的max即为最大公约数
}
}
printf("%d %d\n",i,max);//最后最大公约数用max表示了
return 0;

}

或使用j–

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main()
{
int a,b,i,j;
int max=0;
for(j=a;;j--)//求最大公约数
{
if(a%j==0&&b%j==0)//还是用a和b除以j(j直接赋值为a或b,示例赋值为a(b也可以的))
//利用j--,第一个a和b同时除尽的数j即为最大公约数
break;//然后直接结束循环即可
}
printf("%d %d\n",i,j);
return 0;
}

辗转相除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main()
{
int m,n,t,a,b;
t=0;
scanf("%d %d",&m,&n);
a=m;
b=n;//先把m和n分别赋值给a和b,用来求最小公倍数

while(t=m%n,t!=0)//限制条件有两个
//求出最小公约数和最大公倍数的数值与m和n大小无关,所以不用考虑是m%n还是n%m,结果一样
{
m=n;
n=t;//辗转相除
}
printf("最大公约数是:%d\n",n);//最后n为最大公约数
printf("最小公倍数是:%d\n",a/n*b);

return 0;
}

引用文章:https://blog.csdn.net/m0_66304425/article/details/123920248