Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Задачка
Форумы портала PHP.SU » Разное » Прочее » Задачка

Страниц (1): [1]
 

1. valenok - 12 Июня, 2010 - 20:59:16 - перейти к сообщению
Задача следующая:

Нужно найти скриптом - двухзначное число(XY) у которого
результат умножения первой цифры(X) на вторую(Y) = половина самого числа (XY/2)
Ответ 36 так как 3*6 = 18 = половина от 36

Но мы то с вами ответ знаем, а скрипт ответ не знает.
Помогите скрипту найти ответ за наименьшее количество итераций.

for($i =0; $i < 100; $i++) = 100 итераций.
На данный момент меньше 8ми итераций у меня не получается.
А у вас?
2. qbik - 12 Июня, 2010 - 21:23:55 - перейти к сообщению
вроде за четыре можно
правда много письменной математики
вернее четыре для полной проверки
3. SAD - 12 Июня, 2010 - 21:57:30 - перейти к сообщению
код може индусский, но все продумано матетамитески
PHP:
скопировать код в буфер обмена
  1.  
  2. for($i=1;$i<10;$i++)
  3.   {
  4.     if($i%2==1)
  5.       $a=2;
  6.     else
  7.       $a=4;
  8.     for($j=$a;$j<9;$j+=4)
  9.       {
  10.         if(10*$i+$j==2*$i*$j)
  11.           {
  12.             echo $i.$j;
  13.             exit;
  14.           }
  15.         echo $i.$j."<br/>";
  16.       }  
  17.   }
  18.  
4. qbik - 12 Июня, 2010 - 22:18:20 - перейти к сообщению
сократил до двух итераций
Спойлер (Отобразить)
5. SAD - 12 Июня, 2010 - 22:22:24 - перейти к сообщению
Браво))
6. valenok - 12 Июня, 2010 - 23:16:45 - перейти к сообщению
qbik пишет:
ократил до двух итераций

Это ты на листике решил =) А решить должен скрипт.
Хотя при любом количестве итераций < 99 половину все таки решаем мы, а не скрипт,
зная какие числа следует пропускать.
7. qbik - 12 Июня, 2010 - 23:24:39 - перейти к сообщению
valenok
скрипт тоже мы пишем ;)

кстати ,а твои 8 итераций какие?
8. valenok - 12 Июня, 2010 - 23:27:49 - перейти к сообщению
Да, виноват, видимо не правильная постановка задачи.
У меня получилася вот такой код:
Как у Sad'a в другой записи.

Спойлер (Отобразить)

Число(36) делится на два, значит четное.
Значит вторая цифра в числе должна быть четной.
Перемножение любого числа на четное дает четное - половина нашего числа (36) тоже четная. Значит число(36) делится на 4.

Дальше пропускаем дублирование чисел
12 (21 пропустить)
13 (31 пропустить) и т.д.

Пропускаются также числа заканчивающиеся на 0 и чис
9. Champion - 13 Июня, 2010 - 08:29:14 - перейти к сообщению
Такая же штука, как у qbik.
(10x + y) / (x*y) = 2; Делим обе части уравнения на 2 и умножаем на Х, получаем:
(10х + y) / y = 2x: Отсюда:
y = 5 + y/2x, Т.е Y > 5, т.е. 6,7,8,9. Мы знаем, что он четный, т.е. остаются 6 и 8...*

Из последнего уравнения выражаем Х через У:
y - 5 = y / 2x;
x = y / 2(y - 5);

Значит за 2 итерации можно по-любому найти число. Вот)
for (y = 6; y < 10; y += 2) {
x = y / 2(y - 5);
...
}
(Добавление)
Хотя тут еще видно, что чтобы Х был целым, У должен изменяться не += 2, а по более замысловатой формуле, которая до одной итерации сократит это дело.
Цифра 6 находится из формулы (*), 2 - это из условия (xy/(10x+y)), 5 - это 10/2, т.е. можно по идее найти так решение не только для xy/(10x+y)=2, но и для других чисел? кроме 2.
10. SAD - 13 Июня, 2010 - 11:52:26 - перейти к сообщению
короче говоря, тут программированием и не пахнет то - простая математика и рассуждения.
11. Champion - 13 Июня, 2010 - 11:54:04 - перейти к сообщению
SAD, а прежде, чем кодить, порассуждать никогда не помешает)
12. SAD - 13 Июня, 2010 - 11:56:10 - перейти к сообщению
Я же не спорю, сначала нужно продумать все, построить логику действий - а закодировать, то уже не проблема.

 

Powered by ExBB FM 1.0 RC1