C语言解决“两个数的最大公约数和最小公倍数问题”

C 语言用三种方法解决最大公约数和最小公倍数的问题,有三种解决方法,分别是:

一、辗转相除法:

             设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个非零除数即为(a,b)。

二、穷举法:

            1、对于一种可能的情况,计算其结果。

            2、步来搜索下一个可能的情况;如果符合要求,则表示寻找到一个正确答案。在使用穷举法时,需要明确问题的答案的范围,这样才可以在指定的范围内搜索答案。指定范围之后,就可以使用循环语句和条件语句逐步验证候选答案的正确性,从而得到需要的正确答案。

三、相减法:

           首先用较大数作为被除数,用较小数作除数进行除法运算,若余数不为0,再把上次的除数作为下次的被除数,把上次的余数作为下次的除数,继续去除,直到余数是0为止。

 //利用三种方法求两个数的最大公约数和最小公倍数

//这个程序利用switch语句实现了三个方法的循环功能

//m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 最小公倍数 = 两个数的积 / 最大公约数 
#include<stdio.h>   
//辗转相除法
void method1() 
{ 
 int m, n; 
 int m_cup, n_cup, res; /*被除数, 除数, 余数*/ 
     printf("Enter two integer:\n"); 
     scanf("%d %d", &m, &n); 
 if (m > 0 && n >0) 
 { 
     m_cup = m; 
     n_cup = n; 
     res = m_cup % n_cup; 
  while (res != 0) 
  { 
     m_cup = n_cup; 
     n_cup = res; 
     res = m_cup % n_cup; 
  } 
     printf("Greatest common divisor: %d\n", n_cup); 
     printf("Lease common multiple : %d\n\n", m * n / n_cup); 
 } 
   else printf("Error!\n"); 
} 
void method2()    //穷举法
{
   int i,m,n,t;
    printf("Enter two integer:\n"); 
    scanf("%d %d",&m,&n);
if(m>n)      
{
	t=m;m=n;n=t;      //如果m大于n,交换两个值
}
  for(i=m;i>0;i--)    //将i=m 然后逐个递减
  if(m%i==0 && n%i==0)   //将m和n同时除i取余 直到余数为0
{
	printf("最大公因数是:%d\n",i);

}
  for(i=1;i<=m;i++)
  if(n*i%m==0)
{
	printf("最小公倍数是:%d\n\n",n*i);

}
}
void method3()    //相减法
{ 
	int m,n,i,j;
	printf("Enter two integer:\n");
	scanf("%d%d",&m,&n);
	i=(m>n?n:m);           //选择m n中较小的一个数
	while(!(m%i==0&&n%i==0))
	{
		i--;
	}
	printf("最大公约数为:%d\n",i);
	j=(m>n?m:n);   
	while(!(j%m==0&&j%n==0))
	{
		j++;
	}
	printf("最小公倍数为:%d\n\n",j);

}

void math()
{
	int i;
	printf("1.方法一:\n");  
	printf("2.方法二:\n");
    printf("3.方法三:\n");
	printf("4.退出该程序\n");
    printf("求最大公约数和最小公倍数,请选择你想要的方法:\n");
	scanf("%d",&i);
    switch(i)
	{
	case 1:method1();math();break;
	case 2:method2();math();break;
	case 3:method3();math();break;
	case 4:return;break;
	}
}
int main()
{
	int i;
	printf("1.方法一:\n");
	printf("2.方法二:\n");
    printf("3.方法三:\n");
	printf("4.退出该程序\n");
    printf("求最大公约数和最小公倍数,请选择你想要的方法:\n");
	scanf("%d",&i);
	switch(i)
	{
	case 1:method1();math();break;
	case 2:method2();math();break;
	case 3:method3();math();break;
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值