求解两个非负整数的最大公约数(C语言实现)

  • 问题说明
  • 部分图解
  • 详细代码
  • 测试结果

问题说明

求解两个整数(不能是负数)的最大公约数(要求两个数不能同时为0)

部分图解

求解两个非负整数的最大公约数(C语言实现)_第1张图片

求解两个非负整数的最大公约数(C语言实现)_第2张图片

详细代码

#include 
//求解两个整数(不能是负数)的最大公约数(要求两个数不能同时为0)


unsigned long GCD_EM(unsigned long a, unsigned long b)    //穷举法_每次减去1效率不高
{
     
    if (a == 0)     //如果a为0最大公约数为b
        return b;
    else if (b == 0)   //如果b为0最大公约数为a
        return a;
    else if (a == b)   //如果ab相等则直接返回其中一个
        return a;
    unsigned long gcd = a > b ? a : b;  //得到ab中较小的数字
    while (gcd > 1)     //让较小数字不断减1并且判断能否能够被ab整除
    {
     
        if ((a % gcd == 0) && (b % gcd == 0))
        {
     
            return gcd;
        }
        gcd--;
    }
    return gcd; 
}


unsigned long GCD_SUB(unsigned long a, unsigned long b)    //减法
{
     
	if (a == 0)     //如果a为0最大公约数为b
		return b;
	else if (b == 0)   //如果b为0最大公约数为a
		return a;
	else if (a == b)   //如果ab相等则直接返回其中一个
		return a;
    unsigned long gcd = 0;
    while (a != b)
    {
     
        gcd = a > b?(a -= b) :(b -= a);
    }
    return gcd;
}

//上面的减法在一定效率上提高就变成了除法

unsigned long GCD_TAD(unsigned long a, unsigned long b)    //欧几里得辗转相除法
{
     
	if (a == 0)     //如果a为0最大公约数为b
		return b;
	else if (b == 0)   //如果b为0最大公约数为a
		return a;
	else if (a == b)   //如果ab相等则直接返回其中一个
		return a;
    unsigned long mod = a % b; 
    while (mod != 0)
    {
     
        a = b;
        b = mod;
        mod = a % b;
    }
    return b;
	
}


unsigned long GCD_TAD_REC(unsigned long a, unsigned long b)    //欧几里得辗转相除法的递归实现
{
     
	if (a == 0)     //如果a为0最大公约数为b
		return b;
	else if (b == 0)   //如果b为0最大公约数为a
		return a;
	else if (a == b)   //如果ab相等则直接返回其中一个
		return a;
    else
        return GCD_TAD_REC(b, a % b);
}

int main()
{
     
    unsigned long a;
    unsigned long b;
    printf("a and b cannot be zero the same time!!!\n");
    printf("input a and b :");
    do 
    {
     
      scanf("%ld %ld", &a, &b);
    } while (a == 0 && b == 0);
   
  
 
    //unsigned long result = GCD_EM(a,b);    //穷举测试
    //unsigned long result = GCD_SUB(a, b);   //减法测试
    //  unsigned long result = GCD_TAD(a, b);  //欧几里得辗转相除法的循环实现测试
    unsigned long result = GCD_TAD_REC(a, b);   //欧几里得辗转相除法的递归实现测试
    printf("find %d and %d gcd = %d", a, b, result);
    return 0;
}

测试结果

在这里插入图片描述

你可能感兴趣的:(求解两个非负整数的最大公约数(C语言实现))