| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 12177 人关注过本帖
标题:[求助]求三个数的最大公约数和最小公倍数
只看楼主 加入收藏
ADALE
Rank: 2
等 级:新手上路
威 望:4
帖 子:483
专家分:0
注 册:2005-11-18
收藏
得分:0 
以下是引用羊爱上了狼在2006-2-2 20:26:00的发言:
#include<stdio.h> //求两个数的。。。。
main()
{
int a,b,i,t,half,j,k,beishu;
printf("请输入两个数:");
scanf("%d,%d",&a,&b);
if(a>b)
{t=a;a=b;b=t;}
half=a/2;
for(i=half;i>0;i--) /*因为一个数的最大公约数不可能大于它的一半,不信你可以试一下,其实他

的想法跟你的一样*/
{if(a%i==0&&b%i==0)//最大公约数 //你的最大错误就是用了||,因该用&&,我昨晚就是想你能找出这个错误
break;}
j=a/i;//质因数
k=b/i;//质因素
beishu=i*j*k;//最小公倍数
printf("max=%d,min=%d",i,beishu);
}
我临时写的,楼主参考一下


喜欢宁静的平凡生活
2006-02-03 16:12
黑飞狐
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2005-11-12
收藏
得分:0 
因为我这里用的是!=0,面不是==0,所以只能用||.如果换成&&,则就会错。不信输入三个数试一试就行了。不过如果三个数中有两个数相等,那么求最小公倍数就成了问题。所以此程序还是有问题的。请教。
#include"stdio.h"
main()
{
int a1,a2,a3,b,b1,b2,b3;
printf("输入三个数求其最大公约数和最小公倍数(数与数之间用逗号隔开):\n");
scanf("%d,%d,%d",&a1,&a2,&a3);
b1=a1; b2=a2;b3=a3;
if(a1>a2){b=a1;a1=a2;a2=b;}
if(a1>a3){b=a1;a1=a3;a3=b;}
if(a2>a3){b=a2;a2=a3;a3=b;}
while(a2%a1!=0||a3%a1!=0)a1--;/*此处是只要有其中一个数不能被a1整除,则开始循环。因为我这里用的是!=0,面不是==0,所以只能用||.如果换成&&,则就会错。不信输入三个数试一试就行了。*/
printf("最大公约数是:%d",a1);
printf("最小公倍数是:%d",a1*(b1/a1)*(b2/a1)*(b3/a1));
}

2006-02-03 17:14
zhangjuan
Rank: 1
等 级:新手上路
帖 子:992
专家分:0
注 册:2006-1-19
收藏
得分:0 
楼主我想的话,三个数要求最大公约数的话,应该给三个数先排序吧,然后用辗转法,从小到大吧。
我觉得你可以考虑用数组来存放数字,然后用冒泡法排序,然后再用辗转法。

2006-02-03 19:02
ADALE
Rank: 2
等 级:新手上路
威 望:4
帖 子:483
专家分:0
注 册:2005-11-18
收藏
得分:0 
以下是引用黑飞狐在2006-2-3 17:14:00的发言:
因为我这里用的是!=0,面不是==0,所以只能用||.如果换成&&,则就会错。不信输入三个数试一试就行了。不过如果三个数中有两个数相等,那么求最小公倍数就成了问题。所以此程序还是有问题的。请教。
#include"stdio.h"
main()
{
int a1,a2,a3,b,b1,b2,b3;
printf("输入三个数求其最大公约数和最小公倍数(数与数之间用逗号隔开):\n");
scanf("%d,%d,%d",&a1,&a2,&a3);
b1=a1; b2=a2;b3=a3;
if(a1>a2){b=a1;a1=a2;a2=b;}
if(a1>a3){b=a1;a1=a3;a3=b;}
if(a2>a3){b=a2;a2=a3;a3=b;}
while(a2%a1!=0||a3%a1!=0)a1--;/*此处是只要有其中一个数不能被a1整除,则开始循环。因为我这里用的是!=0,面不是==0,所以只能用||.如果换成&&,则就会错。不信输入三个数试一试就行了。*/
printf("最大公约数是:%d",a1);
printf("最小公倍数是:%d",a1*(b1/a1)*(b2/a1)*(b3/a1));
}


你的最小公倍数的求法错了,这只是适合两个数时使用,以下是我写的程序,你看一下:

#include"stdio.h"

void main()
{ int gys (int a1,int a2,int a3);

int gbs (int ,int );
int min,a1,a2,a3,k,small;
printf("输入三个数求其最大公约数和最小公倍数(数与数之间用逗号隔开):\n");
scanf("%d,%d,%d",&a1,&a2,&a3);
min= gys(a1,a2,a3);
printf("最大公约数是:%d",min);
k=gbs(a1,a2);
small=gbs(k,a3);
printf("最小公倍数是:%d\n",small);


}
int gys (int a1,int a2,int a3){ int min;


min=a1>a2?a2:a1;
min=min>a3?a3:min;

while(a1%min!=0||a2%min!=0||a3%min!=0)min--;
return min;

}
int gbs (int x,int y)
{int m;
m=x>y?y:x;
while (x%m!=0||y%m!=0)
m--;
m=x*y/m;
return m;
}


喜欢宁静的平凡生活
2006-02-04 16:00
liyong06
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-27
收藏
得分:0 
[bo][un]黑飞狐[/un] 在 2006-2-3 15:43 的发言:[/bo]

#include"stdio.h"main(){    int a1,a2,a3,b,b1,b2,b3;    printf("输入三个数求其最大公约数和最小公倍数(数与数之间用逗号隔开):\n");    scanf("%d,%d,%d",&a1,&a2,&a3);    b1=a1; b2=a2;b3=a3;    if(a1>a2){ ...

我试了一下   
如果我输入的是32,32,8\n的话就不对了是吧???????????
2008-08-27 00:26
f319
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-5-13
收藏
得分:0 
(a, b, c) = ((a, b), c)  所以你会求两个数的公因数就可以递归了。
公因数求出来了, 公倍数也是一样。
2008-08-27 00:32
pofengzi
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-8-27
收藏
得分:0 
其实我觉得8楼的第三个if语句可以不要。
2008-08-27 09:24
似水如风
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-8-24
收藏
得分:0 
while(a1%min!=0||a2%min!=0||a3%min!=0)min--;
LZ和ADALE的最大区别就在这,LZ只判断了最小数可以被 a2,a3 整除的情况,但最小数也应该可以被a1(刚输入时的a1)整除。
2008-08-27 17:24
快速回复:[求助]求三个数的最大公约数和最小公倍数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019175 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved