C语言穷举法求最小公倍数

int multiple (int a,int b)
{
int p,q,temp;
p=(a>b)?a:b; /*求两个数中的最大值*/
q=(a>b)?b:a; /*求两个数中的最小值*/
temp=p; /*最大值赋给p为变量自增作准备*/
while(1) /*利用循环语句来求满足条件的数值*/
{
if(p%q==0)
break; /*只要找到变量的和数能被a或b所整除,则中止循环*/
p+=temp; /*如果条件不满足则变量自身相加*/
}
return (p);
}
#include "stdio.h"
main()
{
int m,n,t2;
printf("please input two integer number:");
scanf("%d%d",&m,&n);
t2=multiple(m,n);
printf("The least common multiple is %d\n",t2);
getch();
}
对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。
这句话是什么意思呢??还有函数的定义部分也看不明白。还请大家不吝赐教。

"对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。"这句话分开讲会清楚一点:若干个a之和能被b所整除,或者,若干个b之和能被a所整除,那么该和数即为所求的最小公倍数。但是这个说法有个错误,这个和可能有很多,只能叫公倍数,只有最小的才是最小公倍数。
的意思举个例子:a=10,b=15。a*3 = 30,能被b=15整除,所以30是公倍数,60也行,但30是最小的,所以30是最小公倍数。如果从15看,两个15,b*2 = 30,能整除10.。。。
这段程序的过程就是模拟这个算法,先找到两个数中较大的数p,然后判断p是否能整除q,p*2是否能整除q,p*3是否能整除q。。。。。。直到找到能整除q的,就是最小公倍数了。为什么是最小呢,因为p是从小到大开始找的,第一个找到的肯定是最小公倍数。追问

int p,q,temp;
p=(a>b)?a:b; q=(a>b)?b:a;
1.为什么比较两个数的大小?

temp=p;
2.为什么把最大值赋值给temp?
while(1)
3.为什么循环里的表达式是1?这个最不能理解
{
if(p%q==0)
break;
/*只要找到变量的和数能被a或b所整除,则中止循环*/
4.这个注释该怎么理解呢?
p+=temp; /*如果条件不满足则变量自身相加*/
}
还请大虾帮帮忙,小弟感激不尽

追答

第一个问题:举个例子,如果计算a=5和b=1500的最小公倍数,显然答案是1500,如果直接用a的一倍二倍三倍去比,需要循环300次才能找到1500。而用1500则能一次找到,这里是为了这个目的才用ab之间的最大值去比较。
第二个问题:p要递增一倍二倍三倍等等。用temp是为了保存p的原始值,这样每次运行p+=temp就相当于p增加了一个倍数。
第三个问题,1即是真,这个while(1)的含义是无限循环,当然循环内部有break语句使其退出。
第四个问题,如果那个p的倍数能被q整除表示已经找到了最小公倍数,所以就要退出循环了啊

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-02-18
1、调整一下顺序:对两个正整数a,b,如果若干个a之和能被b所整除(或若干个b之和能被a所整除),则该和数即为所求的最小公倍数。
“若干个a之和”即a的若干倍,它就是a的倍数,如果“若干个a之和”能被b所整除,则它也是b的倍数,因此它就是a和b的最小公倍数。
同理“若干个b之和”也是一样的解释。

2、函数部分:因为“最小公倍数”必定比a,b两数中较小的数大,所以先找出两数其中较大的数给p,较小的数给q,并把较大的数存到temp(用于后面若干个较大数之和)。然后用较大数p除以较小数q,如果能整除,则p就是最小公倍数;如果不能整除,则给p再加上较大数(即若干个较大数之和),再次除以q判断是否能整除,如此循环直到能整除为止,此时的p(已经加了若干次较大数)即为a,b的最小公倍数。
第2个回答  2013-01-26
最小公倍数一定是较大的值的整数倍。
这里是用较大值的一倍、二倍、三倍....去尝试,看是不是能整除较小的数。如果能整除,即是公倍数。

c语言求两个数的最小公倍数
C语言中可以使用欧几里得算法(辗转相除法)、穷举法来求两个数的最小公倍数。欧几里得算法的基本思想是,用较大的数除以较小的数,将得到的余数作为新的被除数,原来的除数作为新的除数,继续进行相同的操作,直到余数为0,此时最后的除数就是最小公倍数。穷举法是枚举所有小于等于两数乘积的正整数,判...

c语言最小公倍数
在C语言最小公倍数是指两个或多个整数的最小正整数倍数。1、利用公式计算:最小公倍数可以通过两个数的乘积除以它们的最大公约数来计算。即LCM(a,b)=(a*b)\/GCD(a,b)。2、利用穷举法:从较大的数开始递增,直到找到一个同时能被两个数整除的数,这个数就是它们的最小公倍数。3、利...

c语言穷举法求最大公约数最小公倍数
int gcd(int a,int b){ int i;for(i=a;i;i--)if(a%i==0&&b%i==0)break;return i;} int lcm(int a,int b){ int i;for(i=b;i<=a*b;i++)if(i%a==0&&i%b==0)break;return i;} int main(){ int a,b,t;scanf("%d%d",&a,&b);if(a>b){ t=a;a=b;b=t...

c语言如何求最小公倍数和最大公约数
对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。\/\/穷举法求两数的最大公约数 int divisor(int a,int b){ int temp;\/\/定义义整型变量 temp=(a>b)?b:a;\/\/采种条件运算表达式求出两个数中的最小值 while(temp>0){ if(a%temp=...

C语言穷举法求最小公倍数
“若干个a之和”即a的若干倍,它就是a的倍数,如果“若干个a之和”能被b所整除,则它也是b的倍数,因此它就是a和b的最小公倍数。 同理“若干个b之和”也是一样的解释。2、函数部分:因为“最小公倍数”必定比a,b两数中较小的数大,所以先找出两数其中较大的数给p,较小的数给q,并...

C语言穷举法求最小公倍数
但是这个说法有个错误,这个和可能有很多,只能叫公倍数,只有最小的才是最小公倍数。的意思举个例子:a=10,b=15。a*3 = 30,能被b=15整除,所以30是公倍数,60也行,但30是最小的,所以30是最小公倍数。如果从15看,两个15,b*2 = 30,能整除10.。。。这段程序的过程就是模拟这个...

c语言最大公约数和最小公倍数
在C语言中,可以使用欧几里得算法(辗转相除法)来计算两个数的最大公约数(GCD),然后使用最大公约数和最小公倍数的关系来计算最小公倍数(LCM)。求最大公约数的方法:方法一:穷举法 先令最大公约数max为1,当俩个数X、都能被循环变量i整除时,把循环变量赋值给最大公约数mx,这样在循环结束...

c语言最小公倍数的求法
1、穷举法:假设有两个整数num1和num2,这两个整数的最小公倍数一定大于等于它们的最大值,同时小于等于它们的积。按从小到大的顺序遍历整个范围内的所有整数,第一个公因数即为它们的最小公倍数。2、定理法:使用定理求最小公倍数(两个整数的最小公倍数等于两数之积除以两个数的最大公因数)...

c语言编程:输入两个正整数,求最大公约数和最小公倍数
"---");System.out.println("利用穷举法计算所得最大公约数为:"+max);System.out.println("利用穷举法计算所得最小公倍数为:"+x*y\/max);\/\/最小公倍数 System.out.println("---");}

C语言|求最大公约数和最小公倍数多种方法
递归版本的辗转相除法简化了代码,使得算法更加清晰。至于最小公倍数,除了穷举法,还可以通过公式法直接计算,即lcm等于a和b的乘积除以它们的最大公约数。总结一下,我们探讨了求最大公约数的穷举法、相减法、辗转相除法(包括递归)以及最小公倍数的穷举法和公式法。虽然方法各异,但结果一致,只是效率...

相似回答