我是Java的初学者。我被要求编写一个程序,找到用户输入的两个数字的GCD。我试过这个但没有输出,如何解决?
import java.util.Scanner;
public class myclass {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
if (a < b) {
for (int c = a; c < 0; c--) {
if (a % c == 0 && b % c == 0) {
System.out.print(c);
}
}
if (b < a) {
for (int c = b; c < 0; c--) {
if (b % c == 0 && a % c == 0) {
System.out.print(c);
}
}
}
}
}
}
答案 0 :(得分:4)
更大的问题是您的循环条件不正确:
for (int c = a; c < 0; c--)
应该是
for (int c = a; c > 0; c--)
反之亦然。虽然通过简单地使用b < a
作为第二个句子(当然还有适当的包围)来处理a == b
问题以及else
是好的。
然后是找到GCD后打印出错误解决方案的问题。为此,请在print语句后使用break;
。
答案 1 :(得分:1)
你有两个ifs,并且有些不正确的for循环比较。尝试:
import java.util.Scanner;
public class myclass {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
if (a < b) {
for (int c = a; c > 0; c--) {
if (a % c == 0 && b % c == 0) {
System.out.print(c);
}
}
}
if (b < a) {
for (int c = b; c > 0; c--) {
if (b % c == 0 && a % c == 0) {
System.out.print(c);
}
}
}
}
}
无论如何,GCD有更好,更有效的算法。我不会为你编码,但它是通过从较大的数字中减去较小的数字来完成的,尽可能多的次数而不会使最终的差异为负。如果最后一个数字不为零,则切换数字并继续。当你最终得到两个相等的数字时,那就是GCD。
答案 2 :(得分:1)
您的循环条件不正确:
for (int c = b; c < 0; c--)
应该有以下几点来理解:
for (int c = b; c > 0; c--)
但是,我会选择Euclid的算法递归方法,有效且简单:
public static int gcd(int p, int q) {
if (q == 0) {
return p;
}
return gcd(q, p % q);
}
答案 3 :(得分:0)
其他人已经修复了你的代码。如果您想要更短的方法,可以查看此示例:
public static void main(String[] args) {
int a = 60;
int b = 24;
for(int i = Math.min(a, b); i > 0; i--){
if(a % i == 0 && b % i == 0){
System.out.println("GCD: " + i);
break;
}
}
}
输出:
GCD:12
使用Math.min()
您不必创建两个循环来查看a
是否应该从哪里开始,或b
。
答案 4 :(得分:0)
你的for循环永远不会在用户的典型(读取:正面)输入上执行。
c
通常不会低于0
,并且循环将在它甚至运行一次之前终止。另请参阅此java tutorial。