+ Задача № 37. Проверить, является ли натуральное число счастливым билетом
Primary tabs
Особенность задачи в том , что нам неизвестно заранее с каким разрядом число рассматривается .
<?php //Пишем любое число $a=8824567; // Число цифр в числе $count=1 ; // Пробуем подсчитать количество разрядов врядли for ($i=1 ; $a / pow (10,$i) >=1 ; $i++) { $count++ ; } echo "Само число: ",$a , "<BR>"; echo "Число знаков : " ,$count,"<BR>" ; //Определили количество цифр (разрядов) в числе /*Теперь запишем условие : 1) если число имеет нечётное количество знаков , то вычитаем из количества знаков единичу и делим пополам и записываем результат в переменную $j , и вычисляем сумму всех цифр от первого цифры до переменной $j .Далее вычисляем сумму всех цифр от переменной $j до числа $count (числа цифр) . Как посчитать сумму цифр ? */ //_________________________________________________________________________________________________________________ /* !!! Очень важно заметить ! что % - это !целочисленный! остаток от деления числа на другое число. Даже если мы имеем число , 345,34 , и 345,34 % 10 мы имеем не 5,34 , а именно только 5 */ // $r и $l -это переменные суммы соответственно правой и левой // частей числа $r=0; $l=0; // Если количество цифр чётно то выполняем одну // группу циклов , со своими счётчиками // если нечётно , то с другими if ($count % 2 == 0 ) { // Здесь количество цифр чётно // значит справа проходим от последней // цифры с порядком $count и до средней цифры // $count/2 + 1 for ($j=$count ; $j >= $count/2+1 ;$j--) { // Считаем сумму правых цифр // Берем остаток от деления на 10 $r = $r + $a % 10 ; // Делим само число на 10 , чтобы передвигаться // налево $a= $a/10 ; } // Считаем цифры справа и налево для левой часи // Здесь счёт от count/2 до 1 for ($j=$count/2; $j >= 1 ;$j--) { // Так же считаем сумму цифр $l = $l + $a % 10 ; $a= $a/10 ; } //Условие "счастливости" if ($r == $l) { echo "Число счастливое " ; } else { echo "Число не счастливое" ; } } // Если число нечётно то код вобщем такой же // но , границы изменения счётчика другие else { for ($j=$count ; $j >= ($count-1)/2+2 ;$j--) { $r = $r + $a % 10 ; $a= $a/10 ; // echo "Нечетное число знаков и \$r=",$r; } $a=$a/10; for ($j=($count-1)/2; $j >=1 ;$j--) { $l = $l + $a % 10 ; $a= $a/10 ; // echo "Нечетное число знаков и \$l=",$l; } if ($r == $l) { echo "Число счастливое " ; } else { echo "Число не счастливое" ; } } ?>
- Log in to post comments
- 15022 reads
vedro-compota
Mon, 09/21/2015 - 10:00
Permalink
получилось ли подсчитать
получилось ли подсчитать число разрядов вашим способом?
_____________
матфак вгу и остальная классика =)
fgh
Wed, 09/23/2015 - 08:06
Permalink
Да получилось .
Да получилось .
А далее осуществил подсчёт суммы разрядов "слева" переменная $l и справа "r" . Для меня стало настоящим открытием :) когда я узнал , что если данное число "$a" равно 99,9 , то
- данное действие вернёт именно 9 , а не "9,9"
Сумма подсчитывается в зависимости от числа разрядов. Оно может быть чётным или нечётным. Чем недоволен - код громоздкий . Надо бы решить задачу болеее оптимально .
vedro-compota
Wed, 09/23/2015 - 10:04
Permalink
другой алгоритм
да, здесь просто надо проходить строку "до середины" слева и справа. и число шагов до середин определить до переборов - тогда их не придётся писать дважды для случая чётности/нечётности.
Блоку перебора должно быть "всё равно" насчёт того чётно или нет число символов строки, которое им перебирается - он просто делает N шагов слева и N справа.
Попробуйте реализовать этот повход, когда вернётесь к данной задаче.
_____________
матфак вгу и остальная классика =)
fgh
Wed, 09/23/2015 - 08:10
Permalink
Да функция count для массива
Да , функция count для массива или строки - это более компактно , но хочется понять , как работают сами функции . Это очень интересно. Хотя время выполнения кода в случае вызова готовой функции, наверное, на порядки выше чем работа своего кода, а для большого кода всей программы это становится существенно.
vedro-compota
Wed, 09/23/2015 - 10:07
Permalink
Да , функция count для
для строки я предлагал другую функцию
точнее, вы хотите реализовать её сами - при первом решении задачи это похвально. Затем рекомендую ниже добавить более оптимальное решение с учётом всех комментариев.
точнее, готовые функции работают намного быстрее, что, как я думаю, вы и подразумевали.
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/23/2015 - 10:08
Permalink
код не прокомментирован
ваш код не прокомментирован.
добавьте краткие комментарии к циклам и блокам условий
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/23/2015 - 10:21
Permalink
// Если число нечётно то код
вот вы сами указали основную проблему решения - вам нужно просто заранее рассчитать условия для счётчика, и всё - а не дублировать код циклов. Потом перепишите решение ниже предыдущего, чтобы была видна разница.
_____________
матфак вгу и остальная классика =)
math2
Sat, 09/26/2015 - 11:00
Permalink
Сокращённый вариант.
Сокращённый вариант.