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

Calculate number of acquired points given an input integer, size of levels, and points per level

我有一个任务,我必须根据一个值达到多少“级别”来计算“获得的分数”。

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

输入值($a)每进入一个新的等级,就获得10分($y = 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,但我想找到一种更有效的技术。

您似乎想为从 1 开始的 x 数字的每个范围添加 y,直到 a如果这个假设是正确的,您可以将 a 除以 x 得到偏移量(将出现的范围数)并将其乘以 y.如果 a / x 的除法有小数,则在乘以 y.

之前将商(如偏移量)增加 1

片段:

<?php

$tests = [
        2,
        5,
        7,
        11,
        12
    ];
    
$x = 5;
$y = 10;

foreach($tests as $a){
    $quo = intval($a / $x);
    if($quo * $x < $a) $quo++;
    echo $a," => " ,$quo * $y,PHP_EOL;
}

演示: https://3v4l.org/rDe3Z

所以,这样,时间复杂度是O(1)

我会简单地使用 ceil($a / $x) * $y 来计算总数。用简单的英语来说,将数字除以每个级别的点数,然后将该值四舍五入为下一个整数,然后将该值乘以每个级别的点数。

我假设负输入不可能或应该产生负结果。我还假设零输入应该有零输出。

代码:(Demo)

$as = [0, 1, 2, 5, 7, 10, 16, 49];
$x = 5;
$y = 10;
foreach ($as as $a) {
    echo "$a => " . (ceil($a / $x) * $y) . "\n";
}

输出:

0 => 0
1 => 10
2 => 10
5 => 10
7 => 20
10 => 20
16 => 40
49 => 100