[新人]关于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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值