• ,

task06.task0606 не проходит проверку

Чётные и нечётные циферки
Ввести с клавиатуры число. Определить, сколько в введенном числе четных цифр, а сколько нечетных.
Если число делится без остатка на 2 (т. е. остаток равен нулю), значит оно четное.
Увеличиваем на 1 счетчик четных цифр (статическая переменная even).
Иначе число нечетное, увеличиваем счетчик нечетных цифр (статическая переменная odd).
Вывести на экран сообщение: «Even: а Odd: b», где а — количество четных цифр, b — количество нечетных цифр.

Пример для числа 4445:
Even: 3 Odd: 1

Собственно код

public class Solution {

    public static int even;
    public static int odd;

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = (reader.readLine().split(""));
        for (int i = 1; i < arr.length; i++) {
            if ((Integer.parseInt(arr[i]))%2 == 0) even++;
            else odd++;
        }
        System.out.println("Even: " + even + " Odd: " + odd);
        //напишите тут ваш код
    }

21 комментарий

4ubaka447
Вы потеряли первый элемент массива arr[0]
sergtt
)))) Я его не потерял, просто когда сплитом нарезаешь String для массива, в нулевой индекс записывается… хрень не нужная. Из массива именно с индекса 1 и до конца идут именно цифры в формате String.
JuriMik
когда сплитом нарезаешь String для массива, в нулевой индекс записывается… хрень не нужная
А поподробнее? Что за «хрень ненужная»? )))
4ubaka447
У меня ваш код при выводе элементов массива дает -1 элемент, т.е. для 4хзначного числа, он вывел мне три элемента. На счет первого элемента не скажу, я вывод вставлял именно в Ваш цикл, стартующий с единицы. Попробуйте перегнать строку в массив символов и работать с его элементами.
sergtt
  • sergtt
  • 0
  • Комментарий отредактирован 2017-02-15 18:15:11 пользователем sergtt
))) цикл, делает именно то о чем вы говорите и именно так потому, что строка
<code>String[] arr = (reader.readLine().split(""));</code>
формирует такой массив с несъедобным объектом в arr[0]. Поэтому цикл начинается с arr[1]. Ведь именно здесь (на индексе 1) начинаются «квазицифры» типа String.
Могу ли считать, что я вас убедил, что цикл и вывод в моем коде рабочие? Хотя и корявые.
4ubaka447
  • 4ubaka447
  • 0
  • Комментарий отредактирован 2017-02-15 20:26:37 пользователем 4ubaka447
не убедили))) вот вам скрин


на всякий случай там и цикл, и отдельный вывод arr[0]
sergtt
  • sergtt
  • 0
  • Комментарий отредактирован 2017-02-16 05:07:41 пользователем sergtt
хм… однако… а у меня так
А не подскажете, что нужно подправить, что бы было как у вас? Ведь дело в IDEA, так ведь?
JuriMik
В консоль выведи arr.length, а также i на каждой строке, вот так
System.out.println(i + " " + arr[i]);
Поможет разобраться. Или включай дебаг
4ubaka447
а можно подробнее подсказочку, а то мне тоже интересно)
4ubaka447
Может быть дело в том что у меня jdk 1.8, а у вас, я вижу 1.7
JuriMik
jdk тут не при чем. Хоть на 1.7, хоть на 1.8 метод split не пишет в 0 элемент то, что у тебя на скриншотах.

Дебаг мод с остановкой на строке
String[] arr = (reader.readLine().split(""));
и смотри, что у тебя в оригинальной строке
sergtt
Я не совсем понимаю что там можно увидеть, но вот скрин
sergtt
  • sergtt
  • 0
  • Комментарий отредактирован 2017-02-17 07:11:16 пользователем sergtt
Странно, конечно, но если строчку String[] arr = (reader.readLine().split("")); разбить на две
<code>String str = reader.readLine();
String[] arr = (str.split(""));</code>
то в нулевой индекс массива записывается нормальная квазицифра первого элемента строки. Я в недоумении…
Spider
У меня эта задача решалась посимвольным чтением в бесконечном цикле while, условием выхода из которого было нажатие 'Enter' ('\n'). Задача нормально решалась и завершалась, но валидацию почему-то не проходила.
Пришлось ловить длину строки и считывать её целиком.
stazys
коллеги, гонял свой вариант с разными числами, включая тестовые, считает всегда правильно, но валидатор так не думает… Не поможете советом?

— public class Solution {

public static int even;
public static int odd;

public static void main(String[] args) throws IOException {

int even=0, odd=0, RestInPeace, tmp;

BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
RestInPeace = Integer.parseInt(bfr.readLine());

while (RestInPeace != 0) {
if ((RestInPeace % 2) == 0) even++;
else odd++;

RestInPeace = (int) Math.floor(RestInPeace/10);
}

System.out.println(«Even: „+even+“ Odd: „+odd);
}
}
stazys
Разобрался сам )
Фишка в том, что не надо переопределять статические переменные класса, а использовать их как они определены. Мелочь, но важно.
Damiankain
  • Damiankain
  • 0
  • Комментарий отредактирован 2018-02-01 16:13:47 пользователем Damiankain
Приветствую.
Есть такой код по этой задаче (не мой):

package com.javarush.task.task06.task0606;

import java.io.*;

/* 
Чётные и нечётные циферки
*/

public class Solution {

    public static int even;
    public static int odd;

    public static void main(String[] args) throws IOException {
        //напишите тут ваш код
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        int i = Integer.parseInt(r.readLine());
        int s;
        while (i != 0) {
            s = i % 10;
            i /= 10;
            if (s % 2 == 0) {
                ++even;
            } else {
                ++odd;
            }
        }
        System.out.print("Even: " + even);
        System.out.println(" Odd: " + odd);
    }
}


Не могу понять как это работает? Что происходит в цикле? Может кто-то подскажет, где читать?
fatfaggy
тут берут остаток от деления на 10
s = i % 10;

если в i лежит число 12345 — то в s попадет 5

потом делят число на 10 с отбрасыванием дробной части
i /= 10;

такая запись, как и a += 5; эквивалентна записи
i = i / 10;

и если в i было 12345, то после этой операции останется 1234

получилось, что в s у нас последняя цифра числа, а в i — то число, что было, только без последней цифры уже.

дальше берем остаток от деления последней цифры числа на 2. если число четное — то результатом будет 0, если нечетное — то 1.
соответственно, в одном случае увеличиваем счетчик четных цифр, либо же нечетных

и повторяем все это дело до тех пор, пока в i не «закончатся цифры» (и там получится 0)

таким образом, после цикла у нас счетчики содержат сколько в первоначальном числе было цифр четных, и сколько там было нечетных
Damiankain
Огромное спасибо за ваше описание. Оно помогло вконец разобраться с этим циклом. Я до такого решения пока что сам не додумался бы. Изначально я думал, что нужно считывать каждый символ в строке и каждый распознавать на четность.Интересно, а такое решение есть?
fatfaggy
  • fatfaggy
  • 0
  • Комментарий отредактирован 2018-02-02 01:24:52 пользователем fatfaggy
да, можете работать со строкой.
просто работа с числами напрямую — быстрее

for(char c : reader.readLine().toCharArray()) {
    if(Integer.parseInt© % 2 == 0) even++
    else odd++;
}


это решение не рабочее, тут немного не хватает… просто показал идею.

без разницы каким способом решать задачу. главное — что получили требуемый результат.
и было бы намного лучше, если бы вы придумали свой способ, чем смотрели другие решения, имхо. пусть он у вас был бы не таким коротким, зато он был бы вашим.
Damiankain
Спасибо за вашу помощь! Возьму на заметку такой вариант. Радует, что тот подход о котором я думал, тоже осуществим.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.