想表示最大公约数与最小公倍数之比为1:120,大概是在判断语句里,用“最小公倍数/最大公约数==120”就行了,如果符合这个条件就跳出。
代码:
#include
//求最大公约数
int GCD(int m,int n)
{
int c,temp=0;
if(m {temp=m;m=n;n=temp;}
for(c=m%n;c!=0;m=n,n=c,c=m%n);
return n;
}
//求最小公倍数
int LCM(int m,int n)
{
int k=m*n;
int c,temp=0;
if(m {temp=m;m=n;n=temp;}
for(c=m%n;c!=0;m=n,n=c,c=m%n);
return k/n;
}
void main()
{
int a,b,m,n;
for(a=1;a<=333;a )
{
b=667-a;
m=GCD(a,b);
n=LCM(a,b);
if(n==120*m)
{
break;
}
}
printf("a=%d
",a);
printf("b=%d
",b);
}
结果:
a=115
b=552
(最大公约数m=23,最小公倍数n=2760)
===================
你说的三个条件具体是哪三个?
其实主要来说,可以构成式子的只有“两个数的合为667”和“最大公约数:最小公倍数=1:120”这两个。
这样的题目,最直接的思路就是用循环去一个一个试数,然后符合一定条件就结束循环,此时循环到的那个数就是你想要的。
但编程序又不能用多元的方程。所以,按其中一个数去循环(按a循环),则在循环过程中这个数a相当于是一个已知的具体数值。
另一个数b用667-a表示的话,那b的值也可以转化为一个具体的数。通过这两个数值能求出他们的最大公约数m和最小公倍数n,这就取得了第二个等式所需要的所有元素的具体值。就可以判断这个等式是否成立了。当等式成立,跳出循环,此时的a、b就是你要的解。
其中要注意的:
1、虽然按a、b的和为667来看,a这个数的取值范围是1到666(667和0的组合求最大公约数和最小公倍数没有意义),但是循环的上线没必要用666,用它的一半333就行了。
这个如果不明白的话请留言吧,我再解释。
2、最大公约数和最小公倍数的比值正好是1比一个整数值,写式子的时候没有必要按题目叙述的顺序写m/n==1/120,因为这样出现了实型数,增加误差。可以调整顺序写成等价的n/m==120,嗯对了,写成n==m*120更好!减小误差。
(我把程序里的条件式也改过来了)
别的有问题再留言吧
(8月21日 17:24)
=====================
不要总想这两个条件之间的联系,其实这两个条件是各司其职呀!
667的作用有两点。
一个是告诉你了这两个数数值上的直接关系;另一个是告诉你了这两个数的取值范围。在程序上,第一点表现在知道了a的值,就可以用667-a求出b;第二点表现在for循环的上下限上。
而1:120那个比值是用来控制程序循环到什么时候该出结果了。
在程序上它表现在if后面括号里的条件式上。
但怎么很好的应用这两个条件一定要在理解程序设计的结构的前提下。
像我前面说的,“这样的题目,最直接的思路就是用循环去一个一个试数,然后符合一定条件就结束循环,此时循环到的那个数就是你想要的。
”
因为是试数的思路,一定要有循环的思想!但是在它的取值范围内从头循环到尾的过程中,那个值是你想要的呢?怎么去判断呢?就要有一个条件来充当这个裁判。在你的题目中,最大公约数跟最小公倍数的比就是这个裁判。
所以第一次循环里用a=1、b=666算出的最大公约数和最小公倍数,一比,不是1:120不要紧,咱们接着循环;第二次a=2、b=665,还是不满足第二个条件也不要紧,再循环……直到a++加到115了,这时b=667-115=552,用这两个数算出的最大公约数m和最小公倍数n的比恰巧为1:120,那么好了,这个a和b的值就是我们想要的数。
每一次循环都肯定满足第一个条件,找他们当中到底哪一个能满足第二个条件也是要用循环的目的啊~
就好比上课的时候老师点名一样。比如已知你是1年级2班的一名学生(相当于第一个条件的第二点),又已知你的名字叫“星空”(相当于第二个条件)。
要求,当点到你的名字的时候你就喊“到”。
这个过程就是,老师选择了用1年级2班的名单(for取值范围)。从第一个人开始点名(执行for循环的过程)。第一个点的是“云淡风轻”,你一看,不是你的名,跳过(if语句的条件式为假的情况)。
第二个点的“荡漾心情”,你一看,又不是你的名,又跳过。终于在点到第10个人的时候点到了“星空”,你一看,终于到自己了(if语句的条件式为真了),你喊了“到”(输出语句)。
不知道这样讲,这两个条件的联系是否清楚一些?
还有,你又提到“怎样来表达其最大公约数与最小公倍数之比”的问题。
知道a和b的值了,可以用函数求出他们的最大公约数和最小公倍数吧。我用m表示最大公约数,n表示最小公倍数。那么,用数学符号表示,那个比值的恒等式应该是m:n=1:120。作为if语句的条件式(一定要明确这个等式要用于条件句哦~),c语言的语句是m/n==1/120。
但是为了避免误差,我们通常要把这个式子变形为乘法式(原理是纯数学问题,等式两边同乘上n*120),则这个等式变为m*120==n。这种用==连接的判断语句,==两头的表达式谁在左谁在右都可以。所以写成if(m*120==n)或者if(n==m*120),放在for循环里面,当等式成立,走if这个分支的时候,那就是该喊“到”的时候了。
另外,你写的你在编这个程序的时候,“另一个数为333-a”,我想大概是笔误吧?667-a才符合条件的。
全部