Перейти к содержанию

Помогите решить задачку


Рекомендуемые сообщения

нужно написать алгоритм решения задачи:

даны целые числа h,m(где h-положение часовой стрелки,а m-минутной стрелки), найти наименьшее время в минутах, когда минутная стрелка совпадет с часовой.

Ссылка на комментарий

Проведи 12 часов записывая положения стрелок на циферблате часов в нужный момент)) Ну или сам какнить на бумажке просчитай.

Затем посчитай значения в массивчег по формуле arr = h * 60 + m

Итак у тебя будет массив из количеств минут, когда часовая и минутная стрелка совпадают.

Затем вводиш значения в программу, опять же считаешь asd = h * 60 + m, и находишь по циклу ближайшее большее значение из массива к полученному количеству минут, считаешь разницу...

Ссылка на комментарий

Проведи 12 часов записывая положения стрелок на циферблате часов в нужный момент)) Ну или сам какнить на бумажке просчитай.

Затем посчитай значения в массивчег по формуле arr = h * 60 + m

жесткое решение :D

PapiruS

чтобы определить во сколько стрелки пересекаются можно посчитать сравнивая положения стрелок(1-й способ), либо использовать миниформулу, исходящую из того, что время пересечения стрелок сдвигается ежечасно на одно и то же кол-во минут, т.к. за 11 часов стрелки пересекутся 12 раз(правда в формуле у меня небольшая погрешность в связи с делением на 11, поэтому ошибочно показывает 60 минут вместо 59):


use POSIX;
use strict;

print "Sposob 1:\n";
my $m=0; my $h=0; my $hm=0; my $i=0;
for (my $t=0;$t<60*12;$t++)
{
$m=$t%60;
if (($t>0) && ($m==0)) {$h++;}
#if (($t>0) && ($t%12==0)) {$hm++;}
$hm = floor($h*5+$m/12.0);
if ($hm==$m) {
$i++;
my $tt = floor($h*60/11);
printf ("%2d: %02d:%02d\n",$i,$h,$hm);
}
}

print "\n\nSposob 2:\n";
for (my $i=0;$i<12;$i++)
{
printf ("%2d: %02d:%02d\n",$i+1,$i,floor($i*60/11));
}

Но следует учитывать, что здесь решения для дискретности положения часовой и минутной стрелки в деление равное 1 минуте, кроме последнего решения - в нем 60-я минута появляется как раз в связи с абсолютной точностью, вместо дискретной.

зы. Надеюсь разобрать перловый код не сложно? :)

Добавлено спустя 25 минут 55 секунд:

А вот собственно само решение(параметры прямо в консоли вводишь - типа "clock.pl 2 0" - рассчитать для 2:00), постарался расписать подлиннее, чтобы понятнее было:


use POSIX;
use strict;

if ($#ARGV>0)
{
$h=$ARGV[0];
$m=$ARGV[1];
$hm=floor($h*60/11)%60;
printf "Result for %1d:%02d - ",$h,$m;
if ($hm>=$m){printf "%02d minut",$hm-$m}
else {printf "%02d minut",$hm+60-$m}
}

Ссылка на комментарий

X-tender

вообще то мне надо было блок схему просто написать:) не мог бы ты её упростить?

чтоб влезло все в один блок и там не должно быть всяких циклов и условий.

Ссылка на комментарий

PapiruS, куда уж еще то упростить? решение и так состоит из трех строчек:


$hm=floor($h*60/11)%60;
if ($hm>=$m)
{printf "%02d minut",$hm-$m}
else
{printf "%02d minut",$hm+60-$m}

Если непонятно на перле то попробую вот так:

h-текущий час, m - текущая минута, hm - положение минутной стрелки в следю пересечение.

result - искомое кол-во минут до пересечения

hm = округлить_в_меньшую_сторону( h*60/11 ) mod 60;

if (hm>=m) result=hm-m

else result=hm+60-m;

Ссылка на комментарий

PapiruS угу, до положения часовой стрелки в момент пересечения

а вообще тут небольшой косячек в елсе - надо там к часу прибавить 1 и снова рассчитать hm b result

Ссылка на комментарий
hm = ( h* 60/11 ) mod 60;

X-tender

обьясни плз как эта формула работает. а то препод придрался обьяснить надо и не принимает.

и почему имено на 11 делим?

Ссылка на комментарий

PapiruS, дело в том что за 12 часов стрелки пересекаются 11 раз.

А вообще составь уравнение положения часовой стрелки(в минутных делениях) от времени(бери лучше время в минутах) и минутной от времени и оттуда придешь к этой формуле.

то есть: DeltaH(t) и DeltaM(t), где t- время в минутах (то есть h*60+m, где h-час,m-минута)

для минут то проще простого: DeltaM= t mod 60

Теперь составь для DeltaH и реши систему уравнений :)

Ссылка на комментарий

Задача: Определить минимальное количество минут, через которое стрелки часов пересекутся.

Исходные данные: (h, m), где h=0..11; m=0..59

Решение:


if ((h * 60 / 11) >= m) RESULT = (h * 60 / 11) - m
else RESULT = ((h+1) * 60 / 11) - m + 60;

Ссылка на комментарий
h * 60 / 11) >= m
считает расстояние от начала до часовой стрелки в минутных делениях?
((h+1) * 60 / 11) - m + 60;
а это можно обьяснить поподробнее плз, и почему именно так
Ссылка на комментарий

PapiruS, у него та же самая формула, что и я тебе давал.

(h * 60 / 11) - да, это положение часовой и минутной стрелок в момент пересечения. ЧТобы формула работала и при 11

((h+1) * 60 / 11) - m + 60;

Это если минутная стрелка в этом часу уже перевалила за часовую стрелку, то рассчитывается для следующего часа

Ссылка на комментарий
  • 2 месяца спустя...

Сорри за беспокойство. Просто попросили решить задачи а я на информатике второй год в CS гоняю... Сами задачи элементарные, даже смешные. Но все уже из черепа вылетело.

Дан массив чисел. Найти наибольшее.

Найти сумму элементов числового массива

Вычислить количество элементов числового массива, кратных 2.

Дан числовой массив и 2 числа A и B. Вывести на экран монитора все числа, большие A но меньшие B.

Дан числовой массив. Вычислить сумму элементов, имеющих четное значение индекса.

Задан одномерный массив. Подсчитать количество элементов массива, больших заданного числа k.

Определить самую высокую температуру и самый теплый день в мае.

Не надо смеятся, но действительно забыл как это все на паскале пишется... Позор на мою седую голову... *20

*добавлено спустя ночь*

А! Перечитал самоучитель по Паскалю! Все выполнил кроме последней. Я ее не догоняю. Эт видимо массив из 31 и найти наиб и его номер что ли?

Ссылка на комментарий

42

как данные представлены не понятно. но смотря на остальные задачки, то скорее всего

массив из 31 числа.

решаешь как первую задачу + выводишь порядковый номер элемента в массиве (номер дня).

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...