Re: Repeating Decimals

From: Date: Fri, 06 Dec 2002 20:36:18 +0000
Subject: Re: Repeating Decimals
References: 1 2  Groups: php.general 
Request: Send a blank email to php-general+get-127321@lists.php.net to get a copy of this message
How would I run the functions though and then print the repeating decimal to the screen? ----- Original Message ----- From: "Tom Rogers" <trogers@kwikin.com> To: "Stephen" <webmaster@melchior.us> Cc: "PHP List" <php-general@lists.php.net> 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 > >

« previous php.general (#127321) next »