求两个数的最大公约数。

求两个数的最大公约数。

// 方法一
#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int  GreastCommon(int x, int y)
{
	int min = x > y ? y : x; // 找出x ,y 中较小的数。
 
	while (min >1){

		if (x % min == 0 && y % min == 0){ // 如果能被同时整除
			
			break; // 此时的min就时最大公约数, 跳出循环,
		
		}

		min--; //如果不能被同时整除,自减
	}

	return min; // 返回min 
}

int main()
{
	int x = 0;
	int y = 0;
	printf("请输入两个数值:");
	scanf(" %d %d", &x, &y);

	int greast = GreastCommon(x, y);

	printf("最大公约数为:%d ", greast);
	system("pause");
}
//方法二 辗转相减法

/*

  假设 x, y 最大公约数为 t , 且 x = n * t  ,  y = m * t 

    x 和 y 谁大就用大的数减去小的数,并将差值赋值给原本较大的数 ,直到两个数相等为止。
*/
#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int  GreastCommon(int x, int y)
{
	while (1){
		
		if (x > y){
			
			x = x - y;  // x > y  , 差值赋给 x 
		
		}
		else if( y > x){
		
			y = y -  x;  // y > x  , 差值赋给 y 


		}
		else{
		
			break; // x y 相等时 ,跳出循环
		}
	}

	return x;
	
}

int main()
{
	int x = 0;
	int y = 0;
	printf("请输入两个数值:");
	scanf(" %d %d", &x, &y);

	int greast = GreastCommon(x, y);

	printf("最大公约数为:%d ", greast);
	system("pause");
        return 0 ;
}
//方法三  辗转相除法求最大公约数

/*
    假设 x, y 最大公约数为 t 

  得 ( n * x + m * y ) % t == 0 , 

若 x > y ——————>    x / y = z .... n 

        ———————>    x  = z*y + n

        ——————>     x - z*y = n        

        ——————>    (   1* x +  (-1)*y  ) % t  == 0

*/


#include <stdio.h>
#include <windows.h>
#pragma warning(disable: 4996)
int  GreastCommon(int x, int y)

{
  // x != 0 && y != 0 , 即当 x 或 y 当中任意一个为0 ,即可得出另一个数为最大公约数 。

  while ( x * y != 0){

		if (x > y){

			x %= y; // x = x % y , 若 得出 x % y 等于0 ,此时 y 为 最大公约数

		}
		else if (y > x){

			y %= x; // y = y % x , 若 得出 y % x 等于0 ,此时 x 为 最大公约数

		}
		else{  // x == y 

			return x; // x = y , 此时即得出x 和 y 就为 最大公约数 
		}

	}

	return x == 0 ? y : x;
}
int main()
{
	int x = 0;
	int y = 0;
	printf("请输入两个数值:");
	scanf(" %d %d", &x, &y);

	int greast = GreastCommon(x, y);

	printf("最大公约数为:%d ", greast);
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值