【问题标题】:Dividing a integer equally in X parts将整数除以 X 部分
【发布时间】:2012-04-28 18:22:39
【问题描述】:

我正在寻找一种在 PHP 中将数字等分的有效方法。数字将始终为整数(无浮点数)。

假设我有一个数组 $hours,其值从“1”到“24”($hours['1'] 等)和一个包含整数的变量 $int。我想要实现的是将 $int 的值平均分布在 24 个部分中,这样我就可以将值分配给每个相应的数组条目。 (如果数字是奇数,剩余的将添加到 24 中的最后一个或第一个值)。

问候,

【问题讨论】:

  • 我对 PHP 了解不多,但是一般用/... 把一个数等分
  • @larsmans 是的。但由于结果可能是偶数,我有点卡在可能性上(例如:400 / 24 = 16.667,并且不能平均分配)。
  • @Jean-PhilippeMurray:在这种情况下你想做什么?
  • @Truth :我想我必须将剩余部分分布在 24 个部分上,或者如果剩余部分只有 1 个,则将其添加到最后一部分的第一个部分。我实际上也不确定该方法,但我不能真正 round() 事情,因为它可能会在总数中减去或添加一个数字(我认为?)

标签: php math


【解决方案1】:

这是您正在寻找的算法;它将整数 N 均匀分布在 K 单元格上:

for i = 0 to K
    array[i] = N / K    # integer division

# divide up the remainder
for i = 0 to N mod K
    array[i] += 1

【讨论】:

  • 你去!我从来没有想过我可以用 N / K 操作作为停止条件的 for 循环。我刚刚在这里学到了一些东西,而且效果非常好!谢谢!
  • @Jean-PhilippeMurray:请查看 Zombaya 刚刚对我的算法所做的更正;循环应该运行到N mod K,而不是N / K
  • 你能解释一下最后 N mod K 和 N / K 有什么区别吗?在测试这两种解决方案时,我似乎没有看到任何区别......
  • @Jean-PhilippeMurray:那么您的测试并未涵盖所有适当的情况。当您将 N 除以 K 时,您会得到 N mod K 的余数,这就是您需要在阵列上“涂抹”的内容。在某些情况下,例如N=3 和 K=2,N/K == N mod K,但不是一般的。
【解决方案2】:

试试这个代码

<?php
$num = 400;
$val = floor($num/24);

for($i=0;$i<24;$i++) {
    $arr[$i] = $val;
}

$arr[0] += $num - array_sum($arr);
?>

【讨论】:

    【解决方案3】:
    function split($x, $n) 
    { 
        // If we cannot split the  
        // number into exactly 'N' parts 
        if($x < $n) 
            echo (-1); 
    
        // If x % n == 0 then the minimum  
        // difference is 0 and all  
        // numbers are x / n 
        else if ($x % $n == 0) 
        { 
            for($i = 0; $i < $n; $i++) 
            { 
                echo ($x / $n); 
                echo (" "); 
            } 
        } 
    
        else
        { 
            // upto n-(x % n) the values  
            // will be x / n  
            // after that the values  
            // will be x / n + 1 
            $zp = $n - ($x % $n); 
            $pp = $x / $n; 
            for ($i = 0; $i < $n; $i++) 
            { 
                if($i >= $zp) 
                { 
                    echo (int)$pp + 1; 
                    echo (" "); 
                } 
                else
                { 
                    echo (int)$pp; 
                    echo (" "); 
                } 
            } 
        } 
    } 
    
    // Driver code      
    $x = 5; 
    $n = 3; 
    split( $x, $n); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2018-01-06
      • 2019-05-05
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多