#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);//输入2个值
int max = 0;
if (a > b) //让max赋值b
{
max = b;
}
else //让max赋值a
{
max = a;
}
while(1) //1为真进入循环
{
if (a % max == 0 && b % max == 0)
{
printf("最大公约数是:%d\n", max);
break;//找到了跳出
}
max--;//不满足条件减1
}
return 0;
}
例20 和 12 20比12大
最大公约数肯定小于等于12 我们直接从12开始每次-1
直到找到满足 20 % max = 0 &&(并且) 12 % max = 0 就找到最大公约数 但有个缺点 比较麻烦
例2:辗转反侧法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = 0;
while (max = a % b) //while循环只有为假0才不循环 (max != 0就在循环)
//12 % 20 =12
//20 % 12 = 8 都为真
{
a = b; //这里把b的值给a
b = max;//算出来的max给b 再重算
}
printf("最大公约数是: %d\n", b);
return 0;
}
实现过程 例a = 12 b =20
第一次 a(12) % b(20) = max (12) (为真进入循环)
把b=20赋值给a
把a % b =12 (也就是max的值)赋值给b
第二次 a(20) % b(12) = max (8)
这里a就变成12
b就变成8
第三次 a(12) % b(8) = max (4)
这里a变成8
b变成4
第四次 a(8) % b(4) = max (0) (此时为假不进入循环)打印b=4