为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
largeQ 2023-09-22 14:34:41
我有一项任务,必须根据值达到的“级别”数量来计算“赚取的积分”数量。假设每个级别的增量范围为 5。换句话说,如果$x = 5这意味着:1 级为 1、2、3、4、5,2 级为 6、7、8、9、10 等每次输入值 ( $a) 进入一个新级别,$y = 10都会获得 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,但我想找到一种更有效的技术。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

似乎您想y对每个范围的x数字进行添加,直到a从 开始1。如果这个假设是正确的,您可以除以a得到x偏移量(将发生的范围数)并将其乘以y。如果 的除法a / x有小数,则在乘以 之前将商(如偏移量)增加 1 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;

}

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

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



查看完整回答
反对 回复 2023-09-22
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我只是简单地用它ceil($a / $x) * $y来计算总数。用简单的英语来说,将数字除以每个级别的分数,然后将该值向上舍入到下一个整数,然后将该值乘以每个级别的分数。

我假设负输入要么是不可能的,要么应该产生负结果。我还假设零输入应该有零输出。

代码:(演示

$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


查看完整回答
反对 回复 2023-09-22
  • 2 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信