求两正整数的最大公约数和最小公倍数

mengsuixinsi 2012-10-28 09:40:29
我的这个程序编译没错课为甚么
运行不成功呢希望前辈们帮着给看看,看哪里需要改进。小弟不胜感激import java.util.Scanner;
public class shiyan2_3
{public static void main(String args[])
{int r=0,p=0;
int max=0,min=0;

Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
if(m>n)
{max=m;
min=n; }
else
{max=n;
min=m;
}
r=max%min;
while(r!=0)
{max=min;
min=r;
}
System.out.println("做大公约数为:"+min);
p=m*n/min;
System.out.println("最小公倍数为:"+p);
}
}
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengsuixinsi 2012-10-29
  • 打赏
  • 举报
回复
非常感谢大家以上的解释,但我还是想知道在我的程序的原有的基础上怎么改进改进就可以了,我改了好几遍怎么都不行呀希望前辈再给点建议
逐兔郎 2012-10-29
  • 打赏
  • 举报
回复
问题不少,照你的思路应该这样改:
while(r!=0)
{
int tmp=max;
max=min;
min=tmp%min;
r=min;
}
System.out.println("做大公约数为:"+max);
p=m*n/max;
System.out.println("最小公倍数为:"+p);

原理是辗除法是不是?
gcd(a,b)=gcd(b,a%b)
当 a%b==0 时,b为最大公约数,另外不需要判断谁大谁小,比如 gcd(6,12)=gcd(12,6)=gcd(6,0),经过一次转换,大数会自动在前,小数在后。
你写的太乱了,给你一个精简版的。
public long gcd2(long M,long N){

while(N!=0){

long rem=M%N;
M=N;
N=rem;
}
return M;

}
yangxingwu1991 2012-10-29
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
int m1,n1,n,m,t,r;
printf("intput m,n:");
scanf("%d%d",&m,&n);
m1=m;
n1=n;
if(m>n)
{
t=m;
m=n;
n=t;
}
r=n%m;
if(r!=0)
{
n=m;
m=r;
r=n%m;
}
printf("最大公约数为:%d\n",m);
printf("最小公倍数为:%d\n",m1*n1/m);
return 0;
}
zjgsu_cy_ak 2012-10-29
  • 打赏
  • 举报
回复
首先你的逻辑上出了点问题,所以虽然程序编写没有报错,但最终却是错误或者成了死循环,下面附上我写的一段程序,纯手工操作:

public class Test {

public static void main(String args[]) {
Test.main(6, 8);
}

public static void main(int m, int n) {
int max = 0, min = 0;

if (m > n) {
max = m;
min = n;
} else {
max = n;
min = m;
}
//r最大公约数,p最小公倍数
int p = 0, r = 1;
if (max % min == 0) {
r = min;
p = max;
} else {
//公约数从2开始
int startP = 2;
//中间生成的数
int midNum = min;
while(startP < midNum) {
boolean flag = false;
for (int i = startP; i <= midNum; i++) {
if (max % i == 0 && midNum % i == 0) {
startP = i;
r = r * i;
midNum = midNum / i;
break;
}
if (i == midNum) {
flag = true;
}
}
if (flag) {
break;
}

}
p = max * midNum;
}
System.out.println("做大公约数为:" + r);
System.out.println("最小公倍数为:" + p);
}

}
a8509190 2012-10-29
  • 打赏
  • 举报
回复
逻辑上的错误,你百度 一堆方法
mengsuixinsi 2012-10-29
  • 打赏
  • 举报
回复
为什么调试的时候出现的是一大堆东西呀,急呀
mengsuixinsi 2012-10-29
  • 打赏
  • 举报
回复
怎么还是不行呀,
逐兔郎 2012-10-29
  • 打赏
  • 举报
回复

LZ到底有没有看我写的啊,这难道不是在你的基础上该的吗?
public class shiyan2_3
{public static void main(String args[])
{int r=0,p=0;
int max=0,min=0;

Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
if(m>n)
{max=m;
min=n; }
else
{max=n;
min=m;
}
r=max%min;
while(r!=0)
{
int tmp=max;
max=min;
min=tmp%min;
r=min
% min=r;
}
System.out.println("做大公约数为:"+max);
p=m*n/max;
System.out.println("最小公倍数为:"+p);
}
}
Inhibitory 2012-10-28
  • 打赏
  • 举报
回复
r=max%min;
while(r!=0)
{max=min;
min=r;
r = max%min; // 少了这里
}

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧