塞维利亚教堂门票预订:如何求两个数

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 09:17:00
我遇到这样一个问题,请大家帮助:
有两个正整数,它们的和为667,其最大公约数与最小公倍数之比为1:120.求这两个数?并打印出其最大公约数与最小公倍数.
(是不是先设一个数为a,另一个数为667-a,让a在1-333范围内循环,然后求出最小公倍数和最大公约数,最后求两个数,如果可以的话,请将其代码和思路告之.谢谢!
此题用C语言

不知道你学什么语言,下面先给出 VB 的算法,其他语言都大同小异.
(把代码复制到记事本后保存为 n.vbs 后就可以运行.)
输出结果为:

(1) 115 和 552
最大公约数: 23
最小公倍数: 2760
(2) 232 和 435
最大公约数: 29
最小公倍数: 3480

//////////////////////////////////////////////////////////

Dim i,a,b,m,n
For i=1 to 334
m = 667 - i
n = i
'下面的Do循环用于求出 m 和 n 的最大公约数
Do
r = m Mod n
m = n
n = r
Loop Until r = 0
a = m
b = m * 120
'如果最大公约数与最小公倍数之比为 1:120 则输出
If i * ( 667 - i ) = a * b Then
Msgbox "这两个数是: " + CStr(i) + " " + CStr(667-i) + vbCrlf + _
"最大公约数是: " + CStr(a) + " 最小公倍数是: " + CStr(b)
End If
Next

///////////////////////////////////////////////////////////

int yushu(int max,int min){
int tmp=0;
if(max<min){tmp=max;max=min;min=tmp;}
tmp = max % min;
if(tmp==0) return min;
else return yushu(min,tmp);
}
int beishu(int max,int min,int ysh){
int tmp=0;
if(max<min){tmp=max;max=min;min=tmp;}
return max*min/ysh;
}
main(){
int a,b,ysh,bsh;
for(a=1,b=667-a;a<b;a++){
b=667-a;
ysh = yushu(b,a);
bsh = beishu(b,a,ysh);
if(bsh/ysh==120)
printf("a=%d b=%d 公约数=%d 公倍数=%d",a,b,ysh,bsh);
}
}
运行结果:
a=115,b=552,a和b的最大公约数:23,最小公倍数:2760
a=232,b=435,a和b的最大公约数:29,最小公倍数:3480