【C语言】辗转相除法

当我们初学C语言时,遇到一个需要我们求出这两个数字的最大公约数的题目,这时我们应该如何去设计代码来完成目的呢?

公约数是什么?这个首先我们需要清楚。它是指能够同时整除几个整数的数,在这个题目里,便是能同时整除两个数字的数。而最大公约数则是指,在上述的基础上,加上一个最大,即在公约数里找到最大的数。

那么我们先不要去想辗转相除法,而是去思考如何设计代码来完成目的。
假设有两个数字:24,18 我们需要求出他们之间的最大公约数。

这个最大公约数是不是需要满足1、能同时整除两个数字 2、在公约数里它是最大的

我们可以从上往下去寻找公约数,一旦找到,那肯定是最大的公约数。

首先设计一个for循环

for(int i = 18; i > 0 ; i - - )
{
if( (24 % i == 0 ) && (18 % i == 0 ) )
{
printf("%d", i ) ;
}
}
if ( i ==0 )
{
printf(“找不到”);
}
-------------------------------------------------分割线
就这样一个简单的代码,就能够实现我们找到最大公约数的功能

为什么我会设置i 为 18? 两个数字的公约数肯定是比这两个数字都要小的,那么当然是从这两个数字中最小的数字开始寻找 公约数。

上述的方法虽然可以解决问题,但是如果题目给我们的数字过大,那么这种代码所要花费的时间是很多的,于是,便有了辗转相除法。

代码:
int x = 24 , y = 18 , z= 0 ; // (初始化)
while ( z = x % y )
{
x = y;
y = z;
}
printf("%d" , y );

首先,x 和 y 的大小这个我们是不需要的管的,无论是 x = 18 ,y = 24还是 x = 24 , y = 18 结果都是一样的。
比如:x = 18 , y = 24 这时候进入了 while循环 ,判断条件里 z = x% y , 这时候 18%24是不是还是等于18? 所以z被赋值为18 。 进入了循环体,x被赋值为了y,即24 y被赋值为了z,即18。
因此,我们没有必要去判断X和Y谁大谁小

当循环进行到 x = 18, y = 6 时,这个时候判断条件里,z == 0 ,因为 18 % 6 ==0,所以循环终止。
那么哪个才是最大公约数呢?就是y ,即6 我们只需要记住这个循环里,取模得到0后,除数是最大公约数就可以了,至于这算法的原理?呃。。。。。。如果你的数学很好的话,可以尝试去理解

我们只需要记住了这个算法思想,那么以后写出来的代码可以不需要按照这种格式写,只要思想是对的,那么过程怎么样都可以。

例如:int x = 24 , y = 18 , z = 0;
while(1)
{
z = x% y;
if ( z == 0 )
{
printf("%d",y);
break;
}
x = y;
y = z;
}

在这里插入图片描述

在这里插入图片描述

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值