给定输入整数、级别大小和每个级别的点数,计算获取的点数
Calculate number of acquired points given an input integer, size of levels, and points per level
我有一个任务,我必须根据一个值达到多少“级别”来计算“获得的分数”。
假设每个级别都有 5 个增量的范围。
换句话说,如果 $x = 5
那意味着:
- 1 级是 1,2,3,4,5 并且
- 2级是6,7,8,9,10等等
输入值($a
)每进入一个新的等级,就获得10分($y = 10
)。
如果 $a
是 2
,则此数字属于第一个范围,因此获得 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;
}
所以,这样,时间复杂度是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
我有一个任务,我必须根据一个值达到多少“级别”来计算“获得的分数”。
假设每个级别都有 5 个增量的范围。
换句话说,如果 $x = 5
那意味着:
- 1 级是 1,2,3,4,5 并且
- 2级是6,7,8,9,10等等
输入值($a
)每进入一个新的等级,就获得10分($y = 10
)。
如果 $a
是 2
,则此数字属于第一个范围,因此获得 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
.
片段:
<?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;
}
所以,这样,时间复杂度是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