Задача Улитка на java. Выдает ошибку NoSuchElementException

Дано следующее условие: улитка поднимается по дереву на a футов в день. Затем каждую ночь улитка сползает вниз на b футов. Высота дерева — h футов.

Напишите программу с подсчетом количества дней, которые потребуются улитке, чтобы добраться до вершины дерева.

Программа читает a, b, h построчно. Входные значения гарантированно являются положительными целыми числами.

Если улитка не может добраться до вершины дерева, должно выводиться сообщение: Impossible.

Немного подправил код.

import java.util.Scanner;
public class Snail{
    public static void main(String[] args) {
        Scanner af = new Scanner(System.in);
        int a = af.nextInt();
        Scanner bf = new Scanner(System.in);
        int b = bf.nextInt();
        Scanner hf = new Scanner(System.in);
        int h = hf.nextInt();
        if (a >= h) {
            System.out.println(1);
           } else if (a<=b) {
            System.out.println("Impossible");
        } else {
            int c = a - b;
            int r = (h - a) / c;
            System.out.println(Math.round(r + 1));
        }
    }
}

Все работает правильно, но не проходит ни один тест. Выдает ошибку: Test name: test{String, String, String, String}[1] Failure message: java.util.NoSuchElementException

В чем может быть проблема?


Ответы (3 шт):

Автор решения: Stanislav Volodarskiy

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

Одна из реализаций использует килобайтный буфер: BUFFER_SIZE = 1024.

Один поток - один сканнер.

→ Ссылка
Автор решения: user504907
import java.util.Scanner;

public class Snail {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int h = sc.nextInt();
        if (a >= h) {
            System.out.println(1);
        } else if (a <= b) {
            System.out.println("Impossible");
        } else {
            int counter = 0;
            int passed = 0;
            while (passed < h) {
                counter++;
                passed = passed + a;
                if (passed >= h) {
                    break;
                } else {
                    passed = passed - b;
                }
            }
            System.out.println(counter);
        }
    }
}
→ Ссылка
Автор решения: AndreyG
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Integer a = scanner.nextInt();
        Integer b = scanner.nextInt();
        Integer h = scanner.nextInt();
//Начинаю с одного дня т.к. дальше проверки на возможность улитки залесть и это минимальное количество дней для нее при небольшой высоте
        Integer day = 1;
//Высота за день
        Integer highForDay = a;
//Проверил условие, при котором за один день улитка достигнет вершины
        if (a >= h) {
            System.out.println(day);
//Проверил условие достижимости улиткой вершины - не должен быть прирост за день отрицательным или равен нулю при длительности ее подъема 2 и более дней
        } else if ((a - b) <= 0 && (a - b) * 2 < h) {
            System.out.println("Никогда");
        } else {
//Зацикливаюсь для подсчета дней
            while (highForDay < h) {
                highForDay += (a - b);
                day++;
            }
            System.out.println(day);
        }
    }
}
→ Ссылка