2013-11-20 16 views
1

Я новичок в Java. Меня попросили написать программу, в которой обнаружен GCD двух чисел, введенных пользователем. Я пробовал это, но без вывода, как его исправить?Исправить 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); 
        } 
       } 
      } 
     } 
    } 
} 
+1

Ваш блок 'if (b Sinkingpoint

ответ

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; 
     } 
    } 
} 

Выход:

НОД: 12

С помощью Math.min() вы не должны создать две петли чтобы узнать, где вы должны начать a, или b.

+0

отличный ответ !! лучший код – user2715467

1

У вас есть два случая внутри друг друга и несколько неправильные сравнения циклов. Попробуйте:

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.

+0

Выход 8 и 6 равен: Почему? – user2715467

+0

Это не работает, если 'a == b'. –

+0

@ user2715467 Ваша программа на самом деле печатает 2 и 1. Используйте 'break;' после печати. – Zong

4

Большая проблема в том, что ваше состояние петли неправильно:

for (int c = a; c < 0; c--) 

должен быть

for (int c = a; c > 0; c--) 

и наоборот. Хотя хорошо справиться с проблемой b < a, а также a == b, просто используя else для второго предложения (при правильном брекетинге, конечно).

. После обнаружения GCD возникает проблема с печатью неправильных решений. Чтобы сделать это, используйте break; после инструкции печати.

0

Ваши циклы никогда не выполняются на типичном (прочитанном: положительном) вводе от пользователя.

c обычно не будет ниже 0, и цикл прекратится, прежде чем он будет запущен один раз. См. Также это java tutorial.

1

ваше состояние петли неправильно:

for (int c = b; c < 0; c--) 

должен быть следующим, чтобы сделать какой-то смысл:

for (int c = b; c > 0; c--) 

Однако, я бы для алгоритма рекурсивного подхода, Евклид, эффективного и простого:

public static int gcd(int p, int q) { 
    if (q == 0) { 
     return p; 
    } 
    return gcd(q, p % q); 
    } 
Смежные вопросы