014 while语句

/****************************014.c while语句*********************************
 * C语言精彩编程百例第14个例子:输入两个正整数,程序输出他们的最大公约数和最小
 * 公倍数 */

#include<stdio.h>
void main()
{
	int x,y,num1,num2,temp;
	printf("请出入两个正整数:\n");
	scanf("%d %d",&num1,&num2);
	if(num1<num2)
	{
		temp=num1;
		num1=num2;
		num2=num1;
	}
	x=num1;
	y=num2;

	while(y!=0)
	{
		temp=x%y;
		x=y;
		y=temp;
	}

	printf("他们的最大公约数为%d\n",x);
	printf("他们的最小公倍数为%d\n",num1*num2/x);
}

 

while 语句内对应的汇编代码

L5:
	cmpl	$0, -8(%ebp)      # 比较0 和 y
	jne	L7                # 如果不等于则跳
	jmp	L6                # 退出循环
L7:
	movl	-4(%ebp), %edx    # edx =x
	movl	%edx, %eax        # eax =edx
	sarl	$31, %edx         # edx右移31位,没搞懂为什么不是数据直接存入eax 清零edx? 
	idivl	-8(%ebp)          # edx:eax/y ; eax存商 ,edx存余数
	movl	%edx, -20(%ebp)   # temp = x%y
	movl	-8(%ebp), %eax    # y = eax
	movl	%eax, -4(%ebp)    # x= eax
	movl	-20(%ebp), %eax   # eax=temp
	movl	%eax, -8(%ebp)    # y=eax
	jmp	L5                # 下一轮循环


求最大公约数的方法,教材中没有给出详细解释:这个算法叫 辗转相除法, 又名欧几里德算法(Euclidean algorithm)。看了介绍后不难理解。  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值