How would I run the functions though and then print the repeating decimal to
the screen?


----- Original Message -----
From: "Tom Rogers" <[EMAIL PROTECTED]>
To: "Stephen" <[EMAIL PROTECTED]>
Cc: "PHP List" <[EMAIL PROTECTED]>
Sent: Friday, December 06, 2002 8:38 AM
Subject: Re: [PHP] Repeating Decimals


> Hi,
>
> Friday, December 6, 2002, 5:00:07 AM, you wrote:
> S> Hello again,
>
> S> This is another PHP mathematical question. How can I display a bar over
a
> S> number (overline) if it's a repeating decimal? When the user types in 1
by
> S> 3, they get 0.333333333333. I want it to display as 0.3 with the 3
> S> overlined. How can I do this keeping in mind that not all numbers will
be
> S> repeating decimals?
>
> Did this as an exercise :)
>
> function check_to_end($str,$pat){
>         $lp = strlen($pat);
>         $ls = strlen($str);
>         $x = 0;
>         while(true){
>                 $ls = strlen($str);
>                 if($ls > $lp){//string bigger than pattern
>                         $t = substr($str,0,$lp);
>                         if($t != $pat){
>                                 return false;
>                         }
>                         $str = substr($str,$lp);
>                 }else{//pattern too big .. checks tail end
>                         $pat = substr($pat,0,strlen($str));
>                         if( $pat != $str) return false; //no repeat
>                         if($x < 2) return false; //didn't repeat enough
>                         return true; //found a pattern
>                 }
>                 $x++;
>         }
> }
> function repeat($num){
>         $s = substr(number_format($num,16),0,-1); //make a string
>         echo $s;
>         list($a,$b) = split('\.',$s); //split decimal bit out
>         $l = strlen($b);
>         for($i=0;$i<$l;$i++){ //loop through string
>                 $o = 0;
>                 $k = $b[$i];    //number to find
>                 for($y = $i+1;$y<$l;$y++){ //loop look for same number
>                         $c = ord($b[$y]);
>                         if(ord($k) == ord($b[$y])){ //got a match
>                                 $pat = substr($b,$i,$y-$i); //cut out
pattern
>                                 $str = substr($b,$i); //string to check
>                                 if(check_to_end($str,$pat)){ //see if
pattern runs till the end
>                                         $o = 1; //yep
>                                         if(ord($pat) == ord('0')) $o = 2;
//were they just '0's
>                                         break;
>                                 }
>                         }
>                 }
>                 if($o)break; // all done
>         }
>         if($o == 1){ // a pattern
>                 $r = $a.'.'.substr($b,0,$i).'<span
style="text-decoration:overline">'.$pat.'</span>';
>         }elseif($o == 2){ // whole bunch of ending 0s
>                 $r = (substr($b,0,$i) != '')? $a.'.'.substr($b,0,$i):$a;
>         }else{ //no repeat
>                 $r = $s;
>         }
>         return $r;
> }
> //usage
> for($x = 1;$x < 100;$x++){
>         $a = 11/$x;
>         $res = repeat($a);
>         echo '&nbsp;&nbsp;&nbsp;returned: '.$res.'<br>';
> }
>
> The  check_to_end() function could probably be replaced with a regex but
those
> go in the same basket as vi with my old brain :)
>
>  Regards Tom
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to