Округление чисел

  • 10
  • Недоступна
Считать с консоли 2 имени файла. Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415. Округлить числа до целых и записать через пробел во второй файл. Закрыть потоки. Принцип округления: 3.49 => 3 3.50 => 4 3.51 => 4 -3.49 => -3 -3.50 => -3 -3.51 => -4
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (102)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Иван Сапронов19 уровень
12 ноября, 05:00
Жаль, но я решил только со второй попытки, т.к. валидатор почему-то не принял округление с Math.rint(), ему подавай именно Math.round()....
Vadim Krant19 уровень, Москва
22 октября, 19:41
Потратил много времени на задачу. Очень много. Задачу не решил, пошёл на войну с валидатором. План работы программы: 1. Читаем влоб все байты из файла (байты читаем как чар, jvm по идее должен сразу выудить по кодировке цифры) 2. Выполняем парсинг считанного массива - ищем пробелы 3. Заполняем ArrayList данными между пробелами в виде строк 4. Парсим массив строк и вытягиваем Float 5. Округляем Float по заданию 6. Сужаем Float до int, чтобы отбросить числа после точки, т.е. делаем из 4.0 -> 4 7. Собираем строку в нужном нам формате с пробелами (3 4 4 -3 -3 -4 ) 8. Выводим строку в поток на запись Файл пишется, данные парсятся, валидатор материться от такого издевательства над ним. идилия ) upd! Задачу решил. Решение канечно странное, строгий паттерн на решение задачи Запись прошла по этому типу записи. FileWriter outpuStream = new FileWriter(path2); Другие варианты он принимать не захотел.
Дмитрий18 уровень, Санкт-Петербург
7 октября, 19:00
Если вдруг кто буксует, обратите внимание, что в Java есть как сырые байтовые потоки (InputStream/OutputStream), так и символьные потоки (Reader/Writer).
Александр Толкачёв22 уровень, Санкт-Петербург
14 сентября, 21:41
Для тех, кто ищет легкие пути - решение со Scanner и FileWriter не работает :(
Александр Толкачёв22 уровень, Санкт-Петербург
27 сентября, 20:21
Чудеса валидатора. Хотя не исключаю своей ошибки, но уже не проверить
Tizor331 уровень
11 августа, 16:21
Уже не столько решение задач, сколько борьба с валидатором... Может не такое лакончиное решение, но тем не менее. В IDEA работает, а другого и не надо. PrintWriter напрямую записывает число в файл, без всякого конвертирования в US-ASCII.
public static void main(String[] args) throws Exception {
       BufferedReader RD = new BufferedReader(new InputStreamReader(System.in));
       String r = RD.readLine();//f2 test
       String t = RD.readLine();//f1 test2
       FileInputStream f2 = new FileInputStream(r);
       FileOutputStream f1 = new FileOutputStream(t);
       RD.close();
       PrintWriter pw = new PrintWriter(t);
       byte[] b = new byte[f2.available()];//test

       while (f2.available() > 0) {//test
           f2.read(b);}

       String s = new String(b, "US-ASCII");
       String[] d = s.split(" ");

       for (int i = 0; i < d.length; i++) {
           float a = Float.parseFloat(d[i]);
           int y = Math.round(a);
           pw.print(y +" ");
          }
      f1.close();
      f2.close();
       pw.close();}}
Anastasiia20 уровень
30 сентября, 02:11
спасибо за подсказку, я так понимаю, что FileOutputStream f1 = new FileOutputStream(t); в таком случае лишний
11 августа, 13:49
Решение со Stream API:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String file1 = reader.readLine();
String file2 = reader.readLine();
reader.close();

String output = Files.lines(Paths.get(file1))
        .map(s -> s.split("\\s"))
        .flatMap(Arrays::stream)
        .map(str -> Math.round(Float.parseFloat(str))+" ")
        .collect(Collectors.joining());
FileWriter out = new FileWriter(file2);
out.write(output);
out.close();
Philip J.40 уровень, Днепр
10 августа, 16:21
Условия проверки очень странные. Вроде того, как, если использовать не тот класс для чтения файла, ломается вся проверка целиком. Даже если протестировать алгоритм и он будет отлично работать - никаких гарантий сдать нет. В таких задачах нужно либо упрощать тесты, которыми покрыта задача, либо делать условия более явными.
Andry Max35 уровень, Минск
9 августа, 18:01
не мало времени потратил, на то чтобы понять и написать паттерн
Pattern p = Pattern.compile("((\\d+|-\\d+)\\.\\d*)|(\\d+|-\\d+)");
       while (m.find()) {
            String a = m.group();
            try {
                g = Integer.parseInt(a);
                sb.append(g + " ");
            } catch (Exception e) {
                d = Double.parseDouble(a);
                u = Math.round(d);
                sb.append(u + " ");
            }
        }
Матвей25 уровень, Санкт-Петербург
14 октября, 20:46
Так и не понял, что означают "-" в паттерне, решил проще "Pattern pattern = Pattern.compile("(\\d+\\.{1}\\d+)");"
Артем36 уровень, Москва
5 августа, 22:30
Мучался час! Double.parseDouble(numbers[i]) Отказывался парсить число взятое из txt файла. Заваливал меня кучей эксепшенов. В итоге оказалось, что проблема была в формате сохранения txt в блокноте. ANSI работает на ура, UTF-8 будет выкидывать эксепшены, хотя визуально со строками все ок и выводятся на экран, но вот парсится не хотят... Если кто знает ответ почему так, пишите, интересно.
Матвей25 уровень, Санкт-Петербург
14 октября, 20:46
Спасибо! Помогло
Дмитрий Сидоров28 уровень, Москва
4 августа, 15:13
for (String i : list){
            if (i.contains("-")){
                if (i.contains(".")){
                    String[] temp = i.split("\\.");
                    int chislo = Integer.parseInt(temp[1]);
                    if (chislo <= 50){
                        result += Integer.parseInt(temp[0]) + " ";
                    }
                    else result += Integer.parseInt(temp[0]) - 1 + " ";
                } else result += i + " ";


            } else if (i.contains(".")){
                String[] temp = i.split("\\.");
                int chislo = Integer.parseInt(temp[1]);
                if (chislo >= 50){
                    result += Integer.parseInt(temp[0]) + 1 + " ";
                } else result += Integer.parseInt(temp[0]) + " ";
            } else result += i + " ";
        }
Вот прям извратился)