2013-07-31 3 views
1
import java.io.*; 
import java.util.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    BufferedReader in = new BufferedReader(new FileReader(new File(args[0]))); 
    String line; 

    while ((line = in.readLine()) != null) { 
     StringTokenizer st = new StringTokenizer(line); 
     int len = st.countTokens(); 
     Double[] seq = new Double[len]; 
     for (int i = 0; i < len; i++) 
      seq[i] = Double.parseDouble(st.nextToken()); 
     Arrays.sort(seq); 
     for (int i = 0; i < len; i++) { 
      if (i > 0) System.out.print(" "); 
      System.out.print(seq[i]); 
     } System.out.print("\n"); 
    } 
} 
} 

Так что я пытаюсь решить эту проблему CodeEval (https://www.codeeval.com/open_challenges/91/), и мое решение не проходит через все тестовые примеры. Я думаю, что мой метод вывода правильный (пробелы между числами, завершающие новую строку). Я не могу понять, что может происходить в сортировке или где-либо еще.Сортировка парных разрядов в java

Решение, по-видимому, неверно при использовании поплавков.

+1

Каков ваш выход с учетом их ввода? –

+0

Некоторые из нас не собираются проверять CodeEval - решать вам, чтобы определить проблему для нас, рассказать нам, что вы пробовали, что произошло и что вы ожидали. –

ответ

2

Я также считаю, что это проблема с печатью. Кажется, что на выходе требуется 3 десятичных разряда на каждом номере, основанные на образце ввода-вывода. Но, если вы распечатываете двойной, как 70.920 (один из примеров входов), он будет отображаться как 70.92.

double d = 70.920; 
System.out.println(d); 
System.out.printf("%.3f", d); // <-- try this 
 
70.92 
70.920 

Обратите внимание, как второй выход согласуется с форматом выходного сигнала образца, тогда как первый не является.

+0

Да, я просто понял после тестирования с помощью ввода образца, что он не печатает столько знаков после запятой, сколько должно. Oops: D Это работает сейчас, так что это, вероятно, проблема. В первый раз я не читал результат правильно. Всем спасибо! – bli0042

+1

@ user82483 Рад, что я мог бы помочь. Не забудьте [принять ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). – arshajii

2

Возможно, что вы правильно отсортировали, но неправильно напечатали. Десятичные числа представлены приблизительно. Среда выполнения пытается показать их в коротком формате, но это не гарантируется.

Все примеры, которые они дали, должны работать, но кто знает, что делает набор тестов в фоновом режиме.

+1

Можете ли вы привести пример трехзначных удвоений, о которых вы говорите? –

+0

@PeterLawrey: Ссылка содержит '-38.797', которая представлена ​​как' -1.0011011001100000010000011000100100110111010010111100 * 2^5' Я не могу получить ни один из инструментов, которые мне удобны, чтобы напечатать его как полную форму (все они понимают, что это должно быть десятичным представлением, так как разница довольно мала). Обычно ошибка проявляется как '-38.7969999' или аналогичная. – Guvante

+2

'Double.toString (double)' будет печатать то же значение, которое вы разобрали до 16 цифр. Просто потому, что он имеет несколько другое представление, это не означает, что toString не исправляет это уже. BTW Вы можете использовать 'new BigDecimal (-38.797)', чтобы увидеть, как он выглядит в десятичном формате. Что такое '-38.796999999999997044142219237983226776123046875', но когда вы печатаете' -38.797', это то, что вы получаете. –

1

Я бы использовал double не Double, и я бы только сортировал значения после прочтения всего, а не после каждой строки.

Возможно, некоторые входы имеют более одной строки?

+0

Кажется, каждая строка должна быть отсортирована отдельно. Любая причина двойной предпочтительнее? – bli0042

+0

@ user82483 Это быстрее и меньше на 100x. –

Смежные вопросы