Sultan
16 уровень

Codes, inc; Room #003

Статья из группы Архив info.javarush
участников

Торт

Codes, inc; Room #003 - 1 На свой день рождения Петя купил красивый и вкусный торт, который имел идеально круглую форму. Петя не знал, сколько гостей придет на его день рождения, поэтому вынужден был разработать алгоритм, согласно которому он сможет быстро разрезать торт на N равных частей. Следует учесть, что разрезы торта можно производить как по радиусу, так и по диаметру. Помогите Пете решить эту задачу, определив наименьшее число разрезов торта по заданному числу гостей (гостей >= 1). Напишите функцию public static int solve(int guests) для решения данной задачи. Доп. задание: Попробуйте решить задачу, не используя условий и тернарных операторов ("?:"). Решение: public static int solve(int guests) { return (guests + 1) / (guests % 2 + 1); }
Комментарии (20)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Docktor91
Уровень 40
26 августа 2014, 13:50
момент…
Sultan
Уровень 16
26 августа 2014, 14:02
1 — Петя тоже торт хочет.
2 — математически твоя формула равна (guests + (guests * (guests % 2))) / 2, но в твоей формуле, если гостей > 181, 183,… 359, 360, 361, 362 и т.д., то выбрасывается исключение деления на ноль.
3 — поскольку здесь целые числа, деление дает целый результат, поэтому программа будет работать неверно (когда guests = 100, то программа возвращает 180 / (360 / 100) = 180 / 3 = 60).
Docktor91
Уровень 40
26 августа 2014, 14:12
public static int solve(int guests)
{
    return ((guests - 1 / guests) % 2 * guests + guests) / 2;
}
Sultan
Уровень 16
26 августа 2014, 14:37
У тебя:
i solve(i)
1 0
2 1
3 3
4 2
5 5
6 3
7 7
8 4

Должно быть:
i solve(i)
1 1
2 3
3 2
4 5
5 3
6 7
7 4
8 9
Docktor91
Уровень 40
26 августа 2014, 14:39
а если Петя диабетик?
я понял о чем ты)
Sultan
Уровень 16
26 августа 2014, 15:16
Если Петя — диабетик, то в торт пихаем подсластители
terranum
Уровень 28
26 августа 2014, 13:26
public static int solve(int guests)
    {
        guests++;
        return (guests / 2) + (guests - guests / 2 * 2) * (guests / 2 + 1);
    }
terranum
Уровень 28
26 августа 2014, 13:04
public static int solve(int guests)
    {
        return (guests/2)+(guests - guests/2*2)*(guests/2+1);
    }
Sultan
Уровень 16
26 августа 2014, 13:09
Вот, что возвращает твой метод:
i solve(i)
1 1
2 1
3 3
4 2
5 5
tsev
Уровень 30
26 августа 2014, 10:15
return (x+1)/((x%2)+1);
Sultan
Уровень 16
26 августа 2014, 10:16
не стоит делить на ноль. просто не стоит…
blacky
Уровень 23
26 августа 2014, 12:00
если пирог у нас вещественный, то каждый получит по бесконечному кусочку пирога =)
blacky
Уровень 23
26 августа 2014, 12:19
Конечно, деление на 0 для целочисленных значений — это очень плохо. Но в условии явно сказано, что гостей будет >= 1. С какого перепуга ещё и на ноль проверять? Ты определил интерфейс и предупреждаешь тех, кто будет использовать твой код, что есть такие-то ограничения. Всё. И защитное программирование должно быть на другой стороне.
Sultan
Уровень 16
26 августа 2014, 13:01
Виноват, я вообще неправильно понял формулу, тут не в наличии гостей дело.
Sultan
Уровень 16
26 августа 2014, 13:05
моя ошибка, показалось, что ((x%2)+1) будет возвращать 0 при четных х
Tan4ek
Уровень 20
26 августа 2014, 09:17
public static int solve(int guests)
        return (guests + 1) % 2 == 0 ? (guests + 1) / 2 : guests;    
    }
Sultan
Уровень 16
26 августа 2014, 09:31
Смотри, если гостей 4, то какой будет ответ? И что выдаст твоя функция?)
Tan4ek
Уровень 20
26 августа 2014, 09:56
Это просто огромный фэйл)
public class NewTask {

    public static int solve(int guests){
        return (guests + 1) % 2 == 0 ? (guests + 1) / 2 : guests + 1;
    }
}
Sultan
Уровень 16
26 августа 2014, 10:00
Молодцом) А можешь без if и ?: сделать?
Tan4ek
Уровень 20
26 августа 2014, 12:17
return (guests + 1) / (int) Math.pow(2 ,guests % 2 );