1.问题分析

数学模型:a,b > 0的整数,c能够整除a、b且a / c与b / c互质。求c。

2.算法设计

思路一: 采用穷举法 / 枚举法按从小到大(初值为1,最大值为两个整数当中较小的数)的顺序将所有满足条件的公约数列出,输出其中最大的一个;第二种,按照从大(两个整数中较小的数)到小(到最小的整数1)的顺序求出第一个能同时整除两个整数的自然数,即为所求。

思路二: 辗转相除法
思路三: 递归调用法:定义一个参数为a、b的函数gcd,如果b为0,返回a;若b不为0,则令a为b,b为a%b(此处通过为函数gcd参数赋值实现),在主函数中调用gcd函数即可。

3.代码实现

/*求两个数的最大公约数*/ 
/*思路一的代码实现*/
#include <stdio.h>
int main()
{
	int a,b,c,i,m,n;
	c=1;
	printf("Please input a,b:\n");
	scanf("%d,%d",&a,&b);
	for(i=2;i<=a and i<=b;i++)
		while(a % i==0 && b % i==0)	/*注意:%为求模运算符,求模后判断是否为0,
									要用==关系运算符,而不能用=赋值运算符*/ 
		{
			c=c*i;
			a=a/i;
			b=b/i;
		}
	printf("%d is maximal common divisior.",c);
	return 0;
 } 
/*辗转相除法*/
#include <stdio.h>
int main()
{
	int a,b,r,temp;
	printf("Please enter a ,b:");
	scanf("%d,%d",&a,&b);
	if(a<b)//如果a<b,将a,b位置对换,即a中存大数,b中存小数
	{
		temp=a;
		a=b;
		b=temp;
	}
	r=a%b;
	while(r!=0)
	{
		a=b;
		b=r;
		r=a%b;
	}
	//当r=0时,b的值就是最大公约数
	printf("%d\n",b);
	return 0;
}
/*递归调用实现*/
#include <stdio.h>
int gcd(int a,int b)
{
	if(b==0)
	{
		return a;
	}
	else
	{
		return gcd(b,a%b);
	}
}

int main()
{
	int a,b;
	printf("Please enter a,b:");
	scanf("%d,%d",&a,&b);
	printf("%d\n",gcd(a,b));
	return 0;
}

4.写在最后

在草稿箱里待了好多天,终于整理的差不多了。不过我看到还有大佬整理的比我的要详细许多,等我去学习一波再回来修正博客。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐