您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-22 20:08 429 查看
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;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: