【问题标题】:I can't figure out general formula for this series我想不出这个系列的通用公式
【发布时间】:2015-10-18 12:32:54
【问题描述】:

我制作了 php 代码来生成发票 pdf。首先打印所有购买的产品的项目(required rows),然后打印filler rows小计和总计总是打印在页面末尾),最后是小计和总计。经过几个小时的思考,我想出了以下逻辑。

我正在使用逻辑来计算从“必需行”计算的额外“填充行”。

这里,数字21 是第一页可以包含的总行数。其余页面可以包含 27 行。

if($required_rows < 21) 
    $filler_rows = 20 - $required_rows;

    // I want a general formula for below series, which I currently use statically like this. 
else  if($required_rows < 48)  // 21 + 27 = 48
    $filler_rows = 24 - ($required_rows - 23 - (27*0));
else if($required_rows < 75) { // 48 + 27 = 75
    $filler_rows = 24 - ($required_rows - 23 - (27*1));
} else if($required_rows < 102) { // 75 + 27 = 102
    $filler_rows = 24 - ($required_rows - 23 - (27*2));
} else if($required_rows < 129) { // 102 + 27 = 129
    $filler_rows = 24 - ($required_rows - 23 - (27*3));
} else if($required_rows < 156) { // 129 + 27 = 156
    $filler_rows = 24 - ($required_rows - 23 - (27*4));
} else if($required_rows < 183) { // 156 + 27 = 183
    $filler_rows = 24 - ($required_rows - 23 - (27*5));
} else if($required_rows < 210) { // 182 + 27 = 210
    $filler_rows = 24 - ($required_rows - 23 - (27*6));
} else if($required_rows < 237) { // 210 + 27 = 237
    $filler_rows = 24 - ($required_rows - 23 - (27*7));
} else if($required_rows < 264) { // 237 + 27 = 264
    $filler_rows = 24 - ($required_rows - 23 - (27*8));
} else if($required_rows < 291) { // 264 + 27 = 291
    $filler_rows = 24 - ($required_rows - 23 - (27*9));
} else if($required_rows < 318) { // 291 + 27 = 318
    $filler_rows = 24 - ($required_rows - 23 - (27*10));
}
... ... ...
... ... ...

有什么想法吗?

【问题讨论】:

  • 您是否尝试过将for 用于相同的逻辑?
  • 我不认为for 可以提供帮助。因为这是逻辑序列的问题,而不是输出序列。

标签: php math mathematical-optimization series


【解决方案1】:

很确定您正在寻找:

$filler_rows = 26 - ($required_rows - 21) % 27;

【讨论】:

  • 你像 WTF 一样简化了这个逻辑。我仍然无法相信 preg_split 可以在一行中完成所有操作。
  • 这是一种恭维,@SohanPatel。简化是一项很棒的技能。
【解决方案2】:

请尝试下面的代码。

if($required_rows < 21) 
    $filler_rows = 20 - $required_rows;    
}else{
    $multiplier = ($required_rows -21)/27;
    if($multiplier>=0){
        $filler_rows = 24 - ($required_rows - 23 - (27*$multiplier));    
    }
}

【讨论】:

    【解决方案3】:

    最好使用 Paul Crovella 的答案

    $num = 21;
    if($required_rows < 21) 
        $filler_rows = 20 - $required_rows;
    else {
        $i = 0;
        while(true){
            $num = $num + 27;
            if($required_rows < $num) {
                $filler_rows = 24 - ($required_rows - 23 - (27*$i));
                break;
            } else {
                $i++;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-23
      • 2023-02-14
      • 2023-01-08
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多