[新人]关于gcd(最大公约数函数)的学习

本文记录了一位新人在学习编程过程中,初次尝试编写求解最大公约数(gcd)函数的经历。初始代码存在错误,经过思考和修正,最终完成了一个基本的gcd函数实现。作者期待有经验的大佬提供指导和优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入两个正整数,求他们的最大公约数。
第一次写的程序如下,但完全是个错误。

#include<stdio.h>
int gcd(int x,int y);//gcd函数
int min(int x,int y);//最小值函数
int main()
{
	int a,b,c;
	scanf("%d %d",&a,&b);
	c=gcd(a,b);
	printf("%d\n",c);
}

int min(int x,int y)
{
	int min;
	min=x;
	if(y<min)
	min=y;
	return min; 
}//求出输入的两个数中的最小值
int gcd(int a,int b)
{
	int i,j,k,n,sum=1,h;
	i=min(a,b);
		if(a==i)
			j=b%i;
		else
		    j=a%i;
	if(j==0)
		return i;
	//检验是否存在最大公约数等于a,b其中一个 
	else{
		h=a%b;
		if(h!=0)
		return 1;//检验最大公因数是否为1
	for(k=2;j!=0;k++){
		n=i%k;
		if(n==0){
			i=i/k;j=b/i;
			sum*=k;
		}
		return sum;	
	}//用输入的两个数中最小值,看看2是否是它的
	}
}


我的思路是:求出a,b中较小值,然后将较小值从高往低除,直到发现他们的最大公约数为止。可是在第一版的代码里面出现了许许多多的bug和想法错误,导致没有成功。
终于在下午体测完之后,脑子稍微清醒一点点,然后改正成为了如下代码。
原谅我狂放不羁的变量名和胡乱一样的语句。

#include<stdio.h>
int gcd(int x,int y);
int min(int x,int y);
int main()
{
	int a,b,c;
	scanf("%d %d",&a,&b);
	c=gcd(a,b);
	printf("%d\n",c);
}

int min(int x,int y)
{
	int min;
	min=x;
	if(y<min)
	min=y;
	return min; 
}//最小值函数,求出ab中最小值者
int gcd(int a,int b)
{
	int i,j,k=2,n,sum=1,h,l=1,c;
	i=min(a,b);
		if(a==i){
		j=b%i;c=b;
			}
		else{
			j=a%i;
			c=a;
		}	   //判断是否出现ab最大公因数是ab其中一个,同时借用这个判断结构,找出ab中最大值,成功实现ab大小值分离。 
	if(j==0)
		return i;
	//检验是否存在最大公约数等于a,b其中一个 
	else{
	for(k=2;j!=0;k++){
		n=i%k;
		if(n==0){
			l=i/k;j=c%l;
		}
		sum=l;
	}//这里的代码有点问题,但是最后感觉还是能做出来,我尽量去解释一下:注意区分整除(1)和整除(2)
	//让k从2开始,用ab较小值模k,然后判断是否整除,如果整除(1),将ab较小值除k,并赋值给l,然后较大值模l,判断是否整除(2),整除的话结束循环,输出l
	//如果没有整除(2)则继续循环,知道找到最大公因数为止。
	//如果整除(1)没有整除,j初始值为1,继续循环,知道找到整除为止。如果最后还是没有整除(1),那么此时k会取到ab中较小值
	//l会等于1,j会等于0,结束循环,返回1为最大公约数。
		return sum;	
	}
}

对于新人来说,独立想出这一段代码真的挺好费时间的(我觉得最后两个整除判断是真的妙(狗头)),肯定有更棒的解决方法,希望有大佬看到这段不成熟的代码可以给我一些指导建议hhh
谢谢各位能看我的垃圾废话看到这里!爱您!


绝了,今天上课看了老师做的gcd,深感自己的数学实在是不行哈哈哈。
明明求最大公因数在数学上用辗转相除最快啊wwww…

#include<stdio.h>

int main()
{
	int r,p,q;
	scanf("%d%d",&p,&q);
	r=p%q;//p是分母,q是分子
	if(r==0)
	  printf("%d",q);
	else
	{
		while(r!=0){
	 	p=q;
		q=r;
		r=p%q;
		
		}
printf("%d",q);
	}
}

### 实现最大公约数函数的方法 最大公约数(Greatest Common Divisor, GCD)是指两个或多个整数共有约数中最大的一个。计算最大公约数的经典算法是欧几里得算法,其核心思想基于以下性质:对于任意两个正整数 \(a\) 和 \(b\),如果 \(a \geq b\),则有: \[ \text{gcd}(a, b) = \text{gcd}(b, a \% b) \] 当 \(b = 0\) 时,\(a\) 即为两者的最大公约数。 以下是使用 C++ 编写的一个简单的递归版本的最大公约数函数实现[^4]: ```cpp int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); } ``` 此外,也可以通过迭代方式实现该功能,如下所示[^5]: ```cpp int gcd(int a, int b) { while (b != 0) { int temp = a % b; a = b; b = temp; } return a; } ``` 上述两种方法均利用了欧几里得算法的核心原理,并且时间复杂度均为 \(O(\log(\min(a,b)))\)。 在实际应用中,C++ 标准库 `<algorithm>` 提供了一个内置的 `std::gcd` 函数用于求解最大公约数,简化了开发工作量。例如: ```cpp #include <iostream> #include <algorithm> int main() { int a = 56, b = 98; std::cout << "GCD of " << a << " and " << b << " is: " << std::gcd(a, b) << std::endl; return 0; } ``` 以上代码展示了如何调用标准库中的 `std::gcd` 来快速获取两个整数的最大公约数[^6]。 ### 注意事项 尽管标准库提供了便捷的功能,但在某些特定场景下可能仍需手动实现自定义逻辑,比如处理负数或者浮点数的情况。此时应特别注意边界条件以及数据类型的兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值