问题:求任意两个整数的最大公约数


接下来咱们就直接上代码!
法一:普通方法
//直接上代码:
#include<stdio.h>
int main()
{
int m,n,temp,i; //分别定义 两个整数n、m, 临时变量temp,循环变量i
printf("请分别输入m和n的值:\n");
scanf("%d,%d",&m,&n);
if(m < n) //比较大小
{ //实现 m与n 之间值的交换, 实现 m > n
temp = m;
m = n;
n = temp;
}
for(i=n; i>0; i--) // 循环变量 i 从 m与n之间较小的数开始 (因为两者间的最大公约数可能是 较小的那个数, 例如:600%30,那么最大公约数为30)
{
if( m%i == 0 && n%i == 0 )
{
printf("%d和%d的最大公约数为%d\n",m,n,i);
break;
}
}
return 0;
}
//例如:
输入 : m=5,n=8
通过if 转换 得到 m=8,n=5
然后循环变量 i = 5 (两者之间 较小的那个数) //这时已经满足: 不大于两者
然后进行:第二个if
if(8 % (5~1) ==0 && 5 % (5~1) == 0) => 筛选出 能"同时整除" 两整数的自然数
最后 输出 最大公约数 i = 1
法二:采用"辗转相除法" ♥♥♥♥♥ :
(2).采用"辗转相除法" ♥♥♥♥♥ :
① 输入数据 (可有可无,具体看题目)
② 比较大小 (由于"辗转相除法"是 不断通过"余数"来作为"除数"的,所以一定是 "大➗小")
切记 为了防止 "被除数" < "除数" 要设置相应的代码处理 (不同题型的处理方式不一样)
③辗转相除 求"最大公约数"
例如: 求1997和615的最大公约数:
1997 % 615 = 152
615 % 152 = 7
152 % 7 = 5
7 % 5 = 2
5 % 2 = 1
2 % 1 = 0 (直到 x % y = 0 才结束!!!)
所以 1997 和 615 的最大公约数为 " 1 "。
注意: 使用"辗转相除法" 记得 将 '%' , '/' 区分开。
%:求余 较小的数 % 较大的数 = 较小的数'本身' 例: 5%6 = 5
/:除 较小的数 / 较大的数 = 0 例: 5/6 = 0
//上代码:
#include<stdio.h>
int main()
{
int m,n,temp;
printf("请输入m和n的值:\n");
scanf("%d,%d",&m,&n);
while( (temp = m%n)!=0 ) //其实就是筛选出 m < n 的值
{
m = n; //如果 m < n 那么就把 n的值赋值给m 从而保证 m > n
n = temp; //然后将 temp, 也就是较小的那个数 赋值给 n (这边解释一下 temp = (m%n! =0) ,其实就是 temp = 两者之间较小的那个数 )
}
printf("m和n的最大公约数为%d\n",n); //如果 m%n !=0 则一直执行 while( ) ,直到最后不满足while()得条件 跳出循环,得到"最大公约数"
return 0;
}
例如:
666 % 23 = 22
23 % 22 = 1
22 % 1 =0
所以666与23的"最大公约数"为: 1
真题演练: 2013-2021 考了1次!!!
"2017.42"
题目:函数int Gcd(int m,int n)的功能是返回整数m和n的最大公约数。例如:输入m=36,n=48,返回值为:12,请填空完成程序。
#include<stdio.h>
int Gcd(int m,int n)
{
if( m % n == 0 ) 考点!!!
//这边有个 误区,切记 '%'与'/' 的区别哦!
{ // 5%6 = 5 , 5/6 = 0
return n; //较小的数 % 较大的数 = 较小数的本身
} //较小的数 / 较大的数 = 0
else
{
return Gcd( n,m%n ); 考点!!! //m%n => 36 % 48 =36
} //可以推出 变成 n % (m%n) => 48 % 36 =12
}
int main()
{
printf("The greatest common divisor is: %d\n",Gcd(36,48));
}
💖 喜欢我的文章,记得点赞👍+评论💬+收藏⭐️+关注😙の,你的反馈就是我不断更新的动力!