给定输入整数、级别大小和每个级别的点数,计算获取的点数

我有一项任务,必须根据值达到的“级别”数量来计算“赚取的积分”数量。

假设每个级别的增量范围为 5。换句话说,如果$x = 5这意味着:

  • 1 级为 1、2、3、4、5,

  • 2 级为 6、7、8、9、10 等

每次输入值 ( $a) 进入一个新级别,$y = 10都会获得 10 分 ( )。

如果$a2,则该数字属于第一个范围,因此可以获得10积分。
而且,$a = 5赚了10$a = 7赚了20,还$a = 12赚了30

我已经使用 while 循环编写了一些代码,但由于时间复杂性,我不想使用 while 循环。

$a = 11;

$x = 5;

$y = 10;

$count = 100/$x;

$i = 1;

$c = 1 ;

while($i<=$count){

    $min = $c ;

    $max = $c = $c + ($x -1);

    if (in_array($a, range($min, $max))) {

        echo "\n result= " . $i * $y;

        break;

    }

    $c++;

    $i++;

}

上面代码的输出是正确的30,但我想找到一种更有效的技术。


largeQ
浏览 106回答 2
2回答

茅侃侃

似乎您想y对每个范围的x数字进行添加,直到a从 开始1。如果这个假设是正确的,您可以除以a得到x偏移量(将发生的范围数)并将其乘以y。如果 的除法a / x有小数,则在乘以 之前将商(如偏移量)增加 1 y。片段:<?php$tests = [&nbsp; &nbsp; &nbsp; &nbsp; 2,&nbsp; &nbsp; &nbsp; &nbsp; 5,&nbsp; &nbsp; &nbsp; &nbsp; 7,&nbsp; &nbsp; &nbsp; &nbsp; 11,&nbsp; &nbsp; &nbsp; &nbsp; 12&nbsp; &nbsp; ];&nbsp; &nbsp;&nbsp;$x = 5;$y = 10;foreach($tests as $a){&nbsp; &nbsp; $quo = intval($a / $x);&nbsp; &nbsp; if($quo * $x < $a) $quo++;&nbsp; &nbsp; echo $a," => " ,$quo * $y,PHP_EOL;}演示: https:&nbsp;//3v4l.org/rDe3Z所以,这样的话,时间复杂度就是O(1)。

慕神8447489

我只是简单地用它ceil($a / $x) * $y来计算总数。用简单的英语来说,将数字除以每个级别的分数,然后将该值向上舍入到下一个整数,然后将该值乘以每个级别的分数。我假设负输入要么是不可能的,要么应该产生负结果。我还假设零输入应该有零输出。代码:(演示)$as = [0, 1, 2, 5, 7, 10, 16, 49];$x = 5;$y = 10;foreach ($as as $a) {&nbsp; &nbsp; echo "$a => " . (ceil($a / $x) * $y) . "\n";}输出:0 => 01 => 102 => 105 => 107 => 2010 => 2016 => 4049 => 100
打开App,查看更多内容
随时随地看视频慕课网APP