RE: [PHP-WIN] Re: Jaw Breaker - What's the ansewer?
| From: | Wu, Jin Yong | Date: | Thu, 21 Apr 2005 02:47:08 +0000 |
| Subject: | RE: [PHP-WIN] Re: Jaw Breaker - What's the ansewer? | ||
| Groups: | php.windows | ||
| Request: | Send a blank email to php-windows+get-25890@lists.php.net to get a copy of this message | ||
It's so interesting. At the beginning, I missed the statement "$x =
round($x, 2) + 0.01;",
and can't get corrent answer.Then, I trace the $x value, I found its value
was changed to have
13 decimal places from 4.43 on. Could you explain it for me?thank you ahead.
-----Original Message-----
From: JC Botha [mailto:odegos@gmail.com]
Sent: Wednesday, April 20, 2005 19:50 PM
To: graeme
Cc: php-windows@lists.php.net
Subject: Re: [PHP-WIN] Re: Jaw Breaker - What's the ansewer?
Well done Graeme!
Posted below is what I used to generate the asnwer, I myself had
dificulty to get it. Let me know if you used another method.
The Source Code
==================================================
<?php
function f($c) {
$c++;
if ($c % 2) { return f($c); }
return $c++;
}
function g($n) {
for ($i=1;$i<10;$i++) {
$n = f($n*$i);
}
return ($n);
}
$x = 0.00;
while ($x < 10){
$x = round($x, 2) + 0.01;
$l = (g($x));
if ($l == 4277108){
echo("<font color='red'>:: x = $x : $l</font>
<br/>");
}
//echo ("> $x : $l<br/>");
}
?>
=================================================
On 4/20/05, graeme <graeme_foster@sherubtse.edu.bt> wrote:
> Yes it is an issue with floating point numbers since:
>
> 8.35 will give the answer but if you increment by .01 in a loop then you
> will not get the answer, when it is on 8.35. However, increment by 0.001
> then 8.35 will provide the correct answer. It's all to do with how in
> calculates 0.01 in binary, a rational fraction in binary.
>
> graeme.
>
> JC Botha wrote:
>
> >It is possible, and "10.642868165785" is incorrect. The question says
> >"$x is a number between 1 and 10 and has 2 decimal places."
> >
> >Try again, if more try then I will post the source code that generates
> >the asnwer?
> >
> >
> >
> >On 4/20/05, M. Sokolewicz <tularis@php.net> wrote:
> >
> >
> >>JC Botha wrote:
> >>
> >>
> >>>The following is a section of PHP code (see Apache.org and PHP.net).
> >>>
> >>> function f($c) {
> >>> $c++;
> >>> if ($c % 2) { return f($c); }
> >>> return $c++;
> >>> }
> >>>
> >>> function g($n) {
> >>> for ($i=1;$i<10;$i++) {
> >>> $n = f($n*$i);
> >>> }
> >>> return ($n);
> >>> }
> >>>
> >>> print(g($x));
> >>>
> >>>What is the smallest value that $x can have if 4277108 is outputted to
> >>>the screen after running this code?
> >>>$x is a number between 1 and 10 and has 2 decimal places.
> >>>
> >>>
> >>it's not a jawbreaker, it's impossible IMO.
> >>f() always returns the number if it's uneven, or if it's even, it
> >>returns (n+1). So, it always returns uneven. which means the result of
> >>g() can *never* be even.
> >>
> >>[[side note:
> >>unless "return $c++;" does first add 1 to it before returning, but I
> >>think it doesn't, since it's a postincrement operator.
> >>]]
> >>
> >>--
> >>PHP Windows Mailing List (http://www.php.net/)
> >>To unsubscribe, visit: http://www.php.net/unsub.php
> >>
> >>
> >>
> >>
> >
> >
> >
>
> --
> Experience is a good teacher, but she sends in terrific bills.
>
> Minna Antrim
>
>
--
PHP Windows Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php