motkot
@motkot
Программирование C#.

Как улучшить алгоритм?

Есть такая задача:

"В плацкартном вагоне 54 места, которые расположены в девяти купе. Места от 1 до 36 основные и они расположены по четыре в купе (1 - 4 в первом, ..., 33 - 36 в девятом), от 37 до 54 - боковые, разбиты по два, но расположение по купе обратное: места 37, 38 находятся в девятом купе, 39 и 40 в восьмом, ..., 53 и 54 в первом. По номеру места определите номер купе."

Я решил ее так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        private static int _placesCount;
        private static int _roomCount = 18;

        private static int _mainRoomPlacesCount = 4;
        private static int _sideRoomPlacesCount = 2;

        static void Main(string[] args)
        {
            _placesCount = (_roomCount / 2 * _mainRoomPlacesCount) + (_roomCount / 2 * _sideRoomPlacesCount);

            while(true)
            {
                var number = 0;

                Console.WriteLine("\n\nВведите номер места:");

                var ParceResult = int.TryParse(Console.ReadLine(), out number);

                if (ParceResult)
                {
                    if(number <= _placesCount && number > 0)
                    {
                        var result = FindRoomByPlace(number);

                        Console.WriteLine("Вывод: " + result);
                    }
                    else
                    {
                        Console.WriteLine("Такого места не существует!");
                    }
                }
                else
                {
                    Console.WriteLine("Ошибка. Не удалось преобразовать строку в число.");
                }
            }
        }

        private static double FindRoomByPlace(int placeNumber)
        {
            var mainPlacesCount = _roomCount / 2 * _mainRoomPlacesCount;

            if(placeNumber <= mainPlacesCount)
            {
                return Math.Ceiling((double)placeNumber / _mainRoomPlacesCount);
            }
            else
            {
                return Math.Ceiling((double)(_placesCount - placeNumber + 0.5f) / _sideRoomPlacesCount);
            }
        }
    }
}


Есть ли какой-то более зачетный вариант?
  • Вопрос задан
  • 142 просмотра
Решения вопроса 2
samodum
@samodum
Какой вопрос - такой и ответ
if (n < 37)
  return (int)((n-1) >> 2)+1;
else
  return (int)((54-n+1) >> 1)+1;

Примерно так

Почему FindRoomByPlace у тебя double?
Разве бывают дробные купе?

Что такое RoomCount и почему их 18?

Код отвратительный
Ответ написан
vabka
@vabka Куратор тега C#
Токсичный шарпист
Добавлю свой вариант решения.
Всё чётко по условию задачи
// (1)     (2)      (3)     (4)     (5)     (6)     (7)     (8)     (9)
// 1   2 | 5   6 | 9  10 | 13 14 | 17 18 | 21 22 | 25 26 | 29 30 | 33 34 |
// 3   4 | 7   8 | 11 12 | 15 16 | 19 20 | 23 24 | 27 28 | 31 32 | 35 36 |
// 54 53  52  51   50 49   48 47   46 45   44 43   42 41   40 39   38 37

public int GetRoomByPlace(int place) =>
    place < 37
        ? (place - 1) / 4 + 1
        : 9 - (place - 37) / 2;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы