Java код для вычисления GCD и LCM из двух чисел работает нормально, но не принимается ни на одной из онлайн-платформ - PullRequest
0 голосов
/ 02 мая 2020

ниже - мой код для вычисления gcd и lcm двух чисел. Когда я пытаюсь с различными тестами, это работает нормально. Но когда я пытаюсь отправить его на онлайн-платформу, он говорит неправильно

package javapractice;
import java.util.*;
public class chef_gcdlcm {

    public static void main(String[] args) {
        try{
            Scanner input = new Scanner(System.in);
            long t = input.nextInt();
            long l,s,temp;
            while(t-->0){
                long A = input.nextLong();
                long B = input.nextLong();
                temp = 1;
                if(A>B){ l = A;
                 s = B;}
                else{ l = B;
                s = A;              
                }
                while(temp!=0){
                    temp = l%s;
                    if(temp!=0){
                        if(temp>s){l = temp;}
                        else{s = temp;}
                    }   
                }
                long gcd = (A*B)/s;
                System.out.println(s +" "+gcd);
            }
            input.close();
        }catch(Exception e){
            e.printStackTrace();
        }

    }

}

Ответы [ 2 ]

1 голос
/ 02 мая 2020

ваш код не работает, здесь исправлено;

package javapractice;
import java.util.*;
public class chef_gcdlcm {

  public static void main(String[] args) {
    try{
        Scanner input = new Scanner(System.in);
        long t = input.nextInt();
        long l,s,temp;
        while(t-->0){
            long A = input.nextLong();
            long B = input.nextLong();
            temp = 1;
            if(A>B){ 
               l = A;
               s = B;
            }else{ l = B;
               s = A;              
            }
            while (s != 0) {
              temp = l % s;
              if (temp > s) {
                 l = temp;
              } else {
                 l = s;
                 s = temp;
              }
            }
           long gcd = (A * B) / l;
           System.out.println(l + ":" + gcd);
        }
        input.close();
    }catch(Exception e){
        e.printStackTrace();
    }

  }

}

то, что вы пропустили;

  1. вы забыли установить значение small (l = s), когда temp меньше l.
  2. вам не нужно проверять это: if(temp!=0) в то время как l oop заботится об этом.
  3. вы должны разделить A * B на l, а не на s в конце. s должно выйти 0.
0 голосов
/ 02 мая 2020

Нет необходимости делать обмен и сравнение. Если необходимо, значения будут исправлены после первой итерации.

Consider l = 24 and s = 36
save = s;    save is 36
l %= s;      l is still 24 
s = l;       s is now 24
l = save     l is now 36

Модифицированный код

try {
    Scanner input = new Scanner(System.in);
    long t = input.nextInt();
    long l, s, temp;
    while (t-- > 0) {
        l = input.nextLong();
        s = input.nextLong();
        long A = s;
        long B = l;
        // doesn't matter which is larger.  It will be corrected
        // after the first iteration.
        while (s > 0) {
             temp = s; 
             l %= s; 
             s = l;
             l = temp;
        }
        long lcm =  (A / l) * B; // prevents overflow
        System.out.println(l + " " + lcm);
    }
} catch (Exception e) {
    e.printStackTrace();
}

Примечание. Не обязательно, полезно и, как правило, не рекомендуется закрывать сканер, когда он был создан с System.in. Это потому, что он также закрывает тот входной поток, который больше не будет доступен в течение всей программы.

...