Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > встреча стрелок на часах


Автор: argamidon 2.12.2011, 12:08
заранее извиняюсь если ошибся темой или резделом.
даны целые числа h(0;12] и m[0;59], указывающие на момент времени. Помогите определить наименьшее время (число полных минут), которое пройдёт до момента встречи(совпадения) стрелок в одной точке.

когда я пытался решить эту задачу, я шёл примерно по такому пути: 
 определял точные угловые координаты часовой и минутной стрелки, и далее запускал цикл до тех пор пока угловое значение не будет равным. тоесть я прибавлял за каждую итерацию угловой расстояние к часовой стрелке по пол градуса(именно столько часовая проходит за одну минуту) и по 6 градусов к минутной стелке(именно столько она проходит за минуту). Кое-что конечно у меня получислоь и я хотел бы знать, если способ прощу и правильнее моего . Заранее извиняюсь за нечитаемость листинга(я только учусь). И получилось примерное такое:
Код

class BodyPosition{
public static void main(String args[]){
 
    
    double h=9,m=5,
            
            h1,m1,posh,posm; // m1 - Движение ачсовой стрелки за минуту, град. 
    double m11; //  m11 - движение минутной стрелки за минуту, (град.). 
    
    h1=360/12; //h1 - это движение часовой стрелки за один час
    
    m1=h1/60;
    
    m11=360/60;
    
    posh=h*h1+m1*m; //позиция часовой стрелки в градусах с начала часа.
    posm=m*m11; // поз. минутной стрелки в град.  с начала часа.
    
   
    System.out.println("позиция часовой стрелки перед совпанием "+posh+" ... "+h+" часов");
    System.out.println("позиция минутной стрелки перед совпанием "+posm+" ... "+m+" минут");
  
    for(;posh>=posm;)
    {
        posh+=m1;
        posm+=m11;
    }
    
    h=(posh -posh%h1)/h1;
     m=(posm-posm%m11)/m11;
     
    System.out.println("позиция часовой стрелки после совпания "+posh+" ..."+h+" часов" );
    System.out.println("позиция минутной стрелки после совпанея "+posm+" ..."+m+" минут" );
    
}}

Автор: AlexKozlov 2.12.2011, 13:07
может вспомнить математику, составить и решить уравненьице? Или задача стоит сделать именно через ж?

да и кстати, числа с плавающей запятой лучше сравнить примерно так |a-b|<точность. Где точность - некое отличное от нуля, но достаточно малое для ваших целей число
иначе вы можете промахнуться, в вашем случае на минуту.

Автор: argamidon 2.12.2011, 13:20
спасибо за советы.  smile 
вот я и создал тему для того чтобы знать что за уравнеице надо составить. самому в башку ничего не приходит.  smile 

Автор: Mirkes 3.12.2011, 19:43
Вообще-то задача решается достаточно просто
Сначала переведем часы и минуты в углы и посчитаем, насколько минутная стрелка отстает от часовой (именно отстает, если угол часовой стрелки составляет 297 градусов, а угол минутной - 324 градусов, то отставание составляет 360+297-324=333 градусов)
Далее угол часовой стрелки увеличивается на 0.5 градуса, а минутной на 6 градусов. Итого расстояние между ними сокращается на 5.5 градуса в минуту.
Следовательно минимальное число минут, через которое минутная стрелка догонит часовую составляет отставание минутной стрелки деленное на 5.5.
Число полных минут - целая часть от этого числа.
Использовать лучше не плавающие типы, а целые. Например
Код

class BodyPosition{
public static void main(String args[]){
  int h=9, m=5;
  int ah=3600/12*h+3600/12/60*m; //угол часовой стрелки в десятых долях градуса
  int am=3600/60*m; // угол минутной стрелки в десятых долях градуса
  int da=ah-am;  // отставание минутной стрелки от часовой
  if (da<0) {
     da=da+3600;
  }
  int mins=da/55; // число ПОЛНЫХ минут до встречи стрелок. стрелки встретятся либо точно в этот момент, либо в течении следующей минуты
  System.out.println("До встречи пройдет "+mins+" полных минут");
}
}

Автор: argamidon 4.12.2011, 18:34
Mirkes спасибо.
я пару дней назад уже решил эту задачу и получи точно такой же ответ 44 минуты. мой второй способ которым я решил задачу очень похож на ваш.
правда я не использовал "встречную скорость 5,5 градусов". там где комметарии, это я пытался выводить формулу. уравнение тоесть , изза отсутствия которого я решал эту задачу с помощь цикла(первый пост). конечно коряво, и через Ж. но работает  smile 
вот листинг =)


Код

class BodyPosition{
public static void main(String args[]){
 
    
    double h=9,m=5,
            
            h1,m1,posh,posm,s1,s2; // m1 - Движение ачсовой стрелки за минуту, град. 
    double m11; //  m11 - движение минутной стрелки за минуту, (град.).  ==6
    
    h1=360/12; //h1 - это движение часовой стрелки за один час
    
    m1=h1/60;
    
    m11=360/60;
    
    posh=h*h1+m1*m; //позиция часовой стрелки в градусах с начала часа.
    posm=m*m11; // поз. минутной стрелки в град.  с начала часа.
    
   
    System.out.println("позиция часовой стрелки перед совпанием "+posh+" ... "+h+" часов");
    System.out.println("позиция минутной стрелки перед совпанием "+posm+" ... "+m+" минут");
  
    
    /**** формула в градусах: 
    posh+s2=posm+s1;
     * s2=s1/12
     * posh+s1/12=posm+s1;
     * 12*posh+s1=12*posm+12*s1;       
     * -11*s1=12*posm-12*posh
     * */
    s1=(12*posh-12*posm)/11;
     
     
    
    
    
    h=(posh-posh%h1)/h1;
     m=(s1-s1%m11)/m11;
     
    System.out.println("позиция часовой стрелки после совпания "+posh+" ..."+h+" часов" );
    System.out.println("позиция минутной стрелки после совпанея "+s1+" ..."+m+" минут" );
    
}}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)