2013-12-03 4 views
5

Я генерироваться случайным образом повторяющихся знаков после запятой, используя этот код ...Найти повторяющуюся часть повторяющегося десятичного - PHP

do{ 
    $divisor_array = array(3, 6, 9, 11, 22, 33); 
    $divisor = $divisor_array[array_rand($divisor_array)]; 
    $number = mt_rand(1, 100); 

    $decimal_value = $number/$divisor; 
} while (strlen($decimal_value) < 5); 

echo $number/$divisor; 

Я хочу, чтобы затем отобразить этот номер с повторяющейся чертой над повторяющейся частью.

Пример: +5,83434343434343 ....
будет 5,8 <span style="text-decoration: overline;">34</span>

Любые идеи о том, как это сделать, если дробей в настоящее время генерируется случайным образом?

+1

У вас есть ограничение на количество повторяющихся узоров, которые вы ищете, чтобы соответствовать? если нет, это может быть очень сложно. например, если повторяющаяся секция очень большая. если вас интересуют только совпадения меньших, например, выше, где всего несколько цифр в шаблоне, это будет не слишком сложно. – Bryan

+0

Я думаю, что было бы лучше ограничить повторяющиеся разделы до 1-3 цифр. Это то, о чем вы спрашивали? – gtilflm

+0

Да, в этом случае это не очень сложно, планируете ли вы показывать максимальное количество десятичных знаков, даже если повторения нет? – Bryan

ответ

3

Должен сказать, что это не так просто, как я думал. но я получил его работу. Я уверен, что есть более эффективный способ сделать это, надеюсь, кто-то еще улучшит это. Особенно там, где он печатается.

$number1 = $number/$divisor; 
if(findRepeat($number1) !== false) 
{ 
    $result = findRepeat($number1); 
    $leadingNum = strstr($number1, '.', true); 
    $nonRepeat = substr($number1, strpos($number1, '.') + 1 , $result['position']); 
    if($nonRepeat == '') 
     $nonRepeat = '.'; 

    $repeat = substr($number1,strpos($number1,$nonRepeat) + strlen($nonRepeat), $result['patternSize']); 
    $nonRepeat = $nonRepeat == '.' ? '.' : '.'.$nonRepeat; 
    echo $leadingNum.$nonRepeat."<span style='text-decoration:overline'>".$repeat."</span>"; 

} 
else 
    echo number_format($number1 , 6); 

теперь для функции

function findRepeat($number) 
{ 
    $maxLength = 6; 
    $decimal = substr($number, strpos($number,'.') + 1); 
    if(strlen($decimal) >= $maxLength) 
     $decimal = substr($decimal,0, $maxLength); 
    else 
     $maxLength = strlen($decimal); 

    for($i =0; $i < $maxLength - 3; ++$i) 
    { 
     //check for single repeition 
     if($decimal[$i] == $decimal[$i + 1] && $decimal[$i + 1] == $decimal[$i+2]) 
      return array('position'=>$i,'patternSize'=>1); 
     //triple repetition 
     if(substr($decimal,$i,3) == substr($decimal, $i + 3, 3)) 
      return array('position'=>$i,'patternSize'=>3); 
     //double repetition 
     if(substr($decimal,$i,2) == substr($decimal, $i + 2, 2)) 
      return array('position'=>$i,'patternSize'=>2); 
    } 

    return false; 
} 
+0

Я все время нажимаю «else» в вашем случае if/else. Кроме того, мне пришлось изменить '$ number' на' $ dec_number' в функции 'findRepeat'. – gtilflm

+0

Я сделал изменение, я использовал статические числа, чтобы проверить его, вычислить число перед подачей его в функцию. я тестировал ваш код, и он работает таким образом – Bryan

+0

, если вы меняете параметр, вам также нужно будет изменить все его вхождения в функции, но я просто протестировал его, как это, с вашим генератором чисел, и это сработало. – Bryan

Смежные вопросы