Ответ 1
Проблема заинтриговала меня, поэтому я пошел вперед и написал тестовый проект в C#
. Насколько я могу сказать, он работает, вам придется протестировать его, чтобы убедиться, что.
Это код:
string strTime = "10:15:00";
DateTime dt = DateTime.ParseExact(strTime, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
int nHourDegrees = (360 / 12) * dt.Hour;
int nMinuteDegrees = (360 / 60) * dt.Minute;
int nSecondDegrees = (360 / 60) * dt.Second;
if (nHourDegrees > nMinuteDegrees)
{
int nArea1 = nHourDegrees - nMinuteDegrees;
int nArea2 = 360 - nArea1;
bool bArea1IsBigger = (nArea1 >= nArea2);
if (nSecondDegrees <= nHourDegrees && nSecondDegrees >= nMinuteDegrees)
{
//Second hand lies in area1
if (bArea1IsBigger)
{
Console.WriteLine("Second hand is in the larger area");
}
else
{
Console.WriteLine("Second hand is in the smaller area");
}
}
else
{
if (bArea1IsBigger)
{
Console.WriteLine("Second hand is in the smaller area");
}
else
{
Console.WriteLine("Second hand is in the larger area");
}
}
}
else if (nMinuteDegrees > nHourDegrees)
{
int nArea1 = nMinuteDegrees - nHourDegrees;
int nArea2 = 360 - nArea1;
bool bArea1IsBigger = (nArea1 >= nArea2);
if (nSecondDegrees <= nMinuteDegrees && nSecondDegrees >= nHourDegrees)
{
//Second hand lies in area1
if (bArea1IsBigger)
{
Console.WriteLine("Second hand is in the larger area");
}
else
{
Console.WriteLine("Second hand is in the smaller area");
}
}
else
{
if (bArea1IsBigger)
{
Console.WriteLine("Second hand is in the smaller area");
}
else
{
Console.WriteLine("Second hand is in the larger area");
}
}
}
else
{
if (nSecondDegrees == nHourDegrees)
{
Console.WriteLine("Second hand is on both of the other hands");
}
else
{
Console.WriteLine("Second hand is in the ONLY area");
}
}
Идея состоит в том, что мы находим области между часами и минутами. Затем проверьте, находится ли вторая рука внутри этой области. Мы также сравниваем эту область с другой, и тогда мы можем легко вывести, если вторая рука находится в меньшей или большей из двух.
Примечание. Некоторые улучшения могут быть внесены в код:
- Это может быть значительно короче - я этого не делал, потому что это было главным образом испытание/доказательство того, как это можно сделать.
- Если перерыв часов (т.е. 24 часа, а не 12), потребуется внести изменения. то есть минус 12
- Если время идет до 12/60/60 и не возвращается к 0, это нужно сделать вручную
- Константы могут быть добавлены для устранения необходимости в магических числах
- Подобно приведенным выше, но общие вычисления, такие как
360 / 12
, могут быть перемещены в константы - Его можно разбить на отдельные методы для улучшения удобочитаемости.
- Можно переместить в вспомогательный метод, т.е.
bool IsInLargerArea(string timeString)
- Нужно добавить случай, когда области имеют одинаковый размер, на данный момент я просто предполагаю, что
Area1
будет больше, если они равны. i.e>=
(больше или равно) - Добавьте проверки, чтобы убедиться, что в массив
straTimes
есть только 3 части - И, возможно, еще несколько вещей, о которых я не думал о