查找重复小数的重复部分--PHP

查找重复小数的重复部分--PHP,php,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 $n

我用这个代码随机生成重复的小数

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;
do{
$divisor_数组=数组(3,6,9,11,22,33);
$divisor=$divisor_数组[array_rand($divisor_数组)];
$number=百万兰特(1100);
$decimal_value=$number/$divisior;
}而(strlen($decimal_值)<5);
echo$number/$divisor;
然后,我想在重复零件上用重复条显示该编号

示例:5.834343
将是5.8<代码>34


如果重复的小数是随机生成的,你有什么办法吗?

我得说这并不像我想象的那么容易。但是我让它工作了。我相信有一种更有效的方法可以做到这一点,希望其他人能改进这一点。特别是它被打印的部分

$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);
$number1=$number/$divisor;
if(findRepeat($number1)!==false)
{
$result=findRepeat($number1);
$leadingNum=strstrstr($number1,“.”,true);
$nonRepeat=substr($number1,strpos($number1,'.')+1,$result['position']);
如果($nonRepeat=='')
$nonRepeat=';
$repeat=substr($number1,strpos($number1,$nonRepeat)+strlen($nonRepeat),$result['patternSize']);
$nonRepeat=$nonRepeat='.'.?'.:'..$nonRepeat;
echo$leadingNum.$nonRepeat.“$repeat.”;
}
其他的
回音号码_格式($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;
}
函数findRepeat($number)
{
$maxLength=6;
$decimal=substr($number,strpos($number,'.')+1);
if(strlen($decimal)>=$maxLength)
$decimal=substr($decimal,0,$maxLength);
其他的
$maxLength=strlen($decimal);
对于($i=0;$i<$maxLength-3;++$i)
{
//检查是否有单次重复
如果($decimal[$i]==$decimal[$i+1]&&$decimal[$i+1]==$decimal[$i+2])
返回数组('position'=>$i,'patternSize'=>1);
//三重重复
if(substr($decimal,$i,3)==substr($decimal,$i+3,3))
返回数组('position'=>$i,'patternSize'=>3);
//重复
if(substr($decimal,$i,2)==substr($decimal,$i+2,2))
返回数组('position'=>$i,'patternSize'=>2);
}
返回false;
}

您希望匹配的重复模式数量是否有限制?如果不是这样,这可能非常困难。例如,如果重复部分非常大。如果您只对匹配较小的部分感兴趣,比如上面的一个,模式中只有几个数字,这不会太困难。我认为最好将重复部分限制为1-3个数字。这就是你要问的吗?是的,在这种情况下这不是很难,你是否计划在没有重复的情况下显示最大小数位数????按照我这样做的方式,我总是会得到一个重复的小数点。如果重复部分是456789,并且您正在寻找3或更少的重复部分,则不会。不是说它不重复,而是没有区别。我想问题很简单,小数点后的最大位数是多少?在if/else语句中,我每次都会打“else”。此外,我还必须在
findRepeat
函数中将
$number
更改为
$dec_number
。我做了一个更改,使用静态数字对其进行测试,在将其输入函数之前计算数字。我用你的代码进行了测试,它是这样工作的如果你要更改一个参数,你也需要更改函数中出现的所有参数,但我只是用你的数字生成器进行了这样的测试,结果成功了。服务器使用的是旧版本的php,所以我不得不使用substr而不是strstr,但代码的其余部分包括数字生成器都是相同的。令人惊叹的!这很有效。我不知道如何处理这个问题,而您的解决方案似乎运行良好。谢谢