+ Задача № 39. Проверить, является ли натуральное число степенью двойки

<?php
  $a = 6 ;
 $c =$a ;
 while ( $a % 2 ==0 )
 {
	 $a = $a/2 ;
 }
 if ($a==1)
 {
	 echo "Число ", $c , " степень числа 2" ;
 }
 else
 {
	 echo "Число ", $c , " е является степенью числа 2" ;
 }
 
?>
fgh's picture

Уважаемые коллеги ! Если решать задачу без ввода переменной $c , то будет код :

<?php
  $a = 6 ;
 while ( $a % 2 ==0 )
 {
	 $a = $a/2 ;
 }
 if ($a==1)
 {
	 echo "Число ", $a , " степень числа 2" ;
 }
 else
 {
	 echo "Число ", $a , " е является степенью числа 2" ;
 }
 
?>

Вопрос , как ограничить зону видимости переменной "a" в цикле ,чтобы функция echo вывела значение переменной $a изначально , а не 1 (один) .

vedro-compota's picture

проверьте отображение:

Вопрос , как ограничить зону видимости переменной $a в цикле ,чтобы функция echo
вывела значение переменной $a изначально , а не 1 (один) .

в одной строке в данный момент знаки доллора нельзя использовать - иначе трактуется как latex.

Обновлено: поправлю сам - но в будущем контролируйте то как выглядит текст.

_____________
матфак вгу и остальная классика =)

Можно просто вывести \$a до его изменения.

<?php
$a = 128;
echo "Число ", $a; 
while ( $a % 2 == 0 )
     $a = $a / 2;
if ( $a == 1 )
	echo " является степенью числа 2.\n";
else
	echo " не является степенью числа 2.\n";
?>
vedro-compota's picture

math2

Можно просто вывести $a до его изменения...

...и тем самым избежать хоть и миниатюрного, но дублирования кода!))

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

Вопрос , как ограничить зону видимости переменной "a" в цикле ,чтобы функция echo
вывела значение переменной $a изначально , а не 1 (один) .

задавайте вопросы в отдельных темах. (уже было сказано) - но сейчас (так и быть) отвечу здесь.

То есть - вы не можете решить проблему в данном случае, используя механизм областей видимости, но можете, например, сохранить значение в другой переменной вместо:

$a = 6 ;

написав вначале:

$a = $b = 6;

_____________
матфак вгу и остальная классика =)

fgh's picture

Спасибо , по сути , необходимо просто приравнять переменные и использовать их в разных областях кода .

vedro-compota's picture

Да, так и есть. Просто "запомнить" значение.

_____________
матфак вгу и остальная классика =)

Добавил рекурсию.

<?php

//Если аргумент---степень двойки, то функция twopow вернёт TRUE.
function twopow($n)
{
	if ( $n % 2 == 0 )
		return twopow($n/2);
	else
	{
		if ($n == 1)
			return TRUE;
		else
			return FALSE;
	}
}

function prnt ($m)
{
	if (twopow($m))
		echo "Число $m является степенью числа 2.\n";
	else
		echo "Число $m не является степенью числа 2.\n";
}

prnt(1024);
prnt(6);
prnt(128);
?>