数到 80,跳过 100 个数字范围内的每 5 个数字

Posted

技术标签:

【中文标题】数到 80,跳过 100 个数字范围内的每 5 个数字【英文标题】:Count to 80, skipping every 5th number in a range of 100 numbers 【发布时间】:2014-08-31 19:30:46 【问题描述】:

我正在做一个包含 80 个编号问题的测验。在每 4 个问题之后,将有一个未编号的第 5 个奖励问题。这 100 个问题在数据库表中具有索引号 (1-100)。可能为奖励问题使用单独的表格更合乎逻辑,但客户希望按该顺序将问题放在一个表格中。

我不想在测验界面中显示红利问题索引号,因此我需要跳过 100 个问题范围内的每 5 个索引号。

我确实设法进行了一个简单的计算,当我在循环中检查它时效果很好,但不知何故我觉得这是一个相当肮脏的解决方案(ceil)。有什么方法可以用更简洁或更合乎逻辑的方式编写这段代码?

动作脚本:

for (var i:Number = 1; i < 101; i++) 
    var displayIndex:Number = Math.ceil((i/5) * 4);
    trace("i:" + i + " / " + displayIndex);

PHP:

for ($i = 1; $i < 101; $i++) 
    echo "i: " . $i . " / displayIndex: " . (ceil(($i/5) * 4) . "<br>");

编辑: 让我试着想象一下这个

index-number =  1 -> display-number =  1
index-number =  2 -> display-number =  2
index-number =  3 -> display-number =  3
index-number =  4 -> display-number =  4
index-number =  5 -> display-number =  none
index-number =  6 -> display-number =  5
index-number =  7 -> display-number =  6
index-number =  8 -> display-number =  7
index-number =  9 -> display-number =  8
index-number = 10 -> display-number =  none
etc...

【问题讨论】:

【参考方案1】:

你的任务足够奇特,你的决定可能足够公平以完成它。它已经足够简化了,但是除了你之外没有人会理解它。

我建议只添加评论。但是,还有很多其他方式,我不能说它们更优雅,但也许更不言自明。

$counter = 1;
for ($i = 1; $i < 21; $i++) 
    $displayNum = $counter;
    if ($i % 5 == 0) 
        $counter--;
        $displayNum = "none";
    
    echo "index-number = $i -> display-number = $displayNum <br/>";
    $counter++;

将导致:

index-number = 1 -> display-number = 1 
index-number = 2 -> display-number = 2 
index-number = 3 -> display-number = 3 
index-number = 4 -> display-number = 4 
index-number = 5 -> display-number = none 
index-number = 6 -> display-number = 5 
index-number = 7 -> display-number = 6 
index-number = 8 -> display-number = 7 
index-number = 9 -> display-number = 8 
index-number = 10 -> display-number = none 
index-number = 11 -> display-number = 9 
index-number = 12 -> display-number = 10 
index-number = 13 -> display-number = 11 
index-number = 14 -> display-number = 12 
index-number = 15 -> display-number = none 
index-number = 16 -> display-number = 13 
index-number = 17 -> display-number = 14 
index-number = 18 -> display-number = 15 
index-number = 19 -> display-number = 16 
index-number = 20 -> display-number = none 

如果你尝试用三元运算符来缩小它,你最终会得到和你一样的代码,它是 crypt 的,而不是解释性的。

您可以使用continue 跳过迭代并在此之前添加所需的输出。可以通过以下方式实现相同的结果:

$counter = 1;
for ($i = 1; $i < 21; $i++) 
    if ($i % 5 == 0) 
        echo "index-number = $i -> display-number = none <br/>";
        continue; // more explanatory for SKIP THIS ITERATION
    
    echo "index-number = $i -> display-number = $counter <br/>";
    $counter++;

这样您将打印none 并跳过迭代的执行,因此$counter 不会增加,并且在第6 次迭代时它将是5。

【讨论】:

感谢您的回答和建议。每位参与者每天回答 4 个问题和一个奖励问题。因此,参与者的“计数”从另一个 FEU 表中检索,并在每次回答 5 个问题时存储。当参与者的“计数”为 f.i.在图 40 中,问题 40 显示但显示为“问题 32”这就是为什么我必须计算显示编号,在这种情况下为 (ceil((40/5) * 4)。另一种解决方案是增加并存储“计数” ' 每回答 5 个问题时加 1。这样我就可以检索 'count' 并乘以 5。 你的桌子不能有标志 - 正常问题计数和奖励问题计数,因此如果参与者回答所有 5 个问题,您将知道他回答了 4 个正常问题和 1 个奖励问题。当他连续 8 天回答 4+1 个问题时,您将有 8*4=32 个计数存储在 DB 中的普通问题和 8*1 = 8 个存储在特殊问题的计数。这样,您将知道从数据库中检索到的要显示给最终用户的问题的确切数量,而不是通过一个奇怪的公式计算:) 标志可以工作,但是我不允许更改任何表的任何内容或存储除此计数和给出的答案之外的任何内容。不幸的是,我不能每 5 个问题将计数增加 1,因为来自其他应用程序的其他脚本需要将该计数用于其他目的。所以我坚持使用存储在某些 FEU 系统中的“计数”,检索从该计数开始的 5 个问题,然后将其更改为界面中的显示编号。然而,使用 ceil 似乎很脏,这就是为什么我想知道是否有更整洁的方法。 我发布的其他方式并不优雅。如果您想对代码进行自我解释,那就是 - 您应该使用模数,计算 $i % == 0; 40 questions; 8 special; Display num = All questions - Special Questions。您可以通过几种算法来实现,我假设所有这些算法都比数据库存储更糟糕,但是由于您无法更改数据库,因此您无法获得最大的优雅:)【参考方案2】:

试试

if($i % 5 != 0) 
  // do your stuff

else 
  // skipped

根据预期输出:-

for ($i = 1; $i < 101; $i++) 
    echo 'index-number = '. $i.' -> display-number ='. (($i % 5 != 0) ? $i : 'none').'<br>';  

输出:-

index-number = 1 -> display-number =1
index-number = 2 -> display-number =2
index-number = 3 -> display-number =3
index-number = 4 -> display-number =4
index-number = 5 -> display-number =none
index-number = 6 -> display-number =6
index-number = 7 -> display-number =7
index-number = 8 -> display-number =8
index-number = 9 -> display-number =9
index-number = 10 -> display-number =none
and so on....

【讨论】:

该死,你打败了我! 我可能没有明确地问这个问题,对此感到抱歉。如果我必须知道索引号是否是第 5 个问题,模数会起作用。但是当我得到问题的索引号时,我需要将其转换为执行以下操作的显示编号:(ceil(($i/5) * 4) @ben,所以如果 $i = 10;那么 ceil(10/5)*4 是 8 ...你想知道 8 是否是第五次迭代吗?我猜不是? @Royal Bg,如果 $i = 10 那么我知道我必须用 8 替换它 / 如果 $i = 33 那么我知道我必须用 27 / 如果 $i = 50 替换它我知道我必须将其替换为 40 / (ceil(($i/5) * 4) 可以满足我的要求,但我想知道是否有一种更简洁的方式来编写它 @Ben,但是你为什么要替换,总体意义是什么?您在数据库中有 100 个问题,在遍历结果集时有什么问题,在每第五次迭代(使用模数)而不是获取下一行之后,获取一个奖励问题?

以上是关于数到 80,跳过 100 个数字范围内的每 5 个数字的主要内容,如果未能解决你的问题,请参考以下文章

JAVA怎样随机生成10W个数字, 要求: 10W个数字总等于50W而且每个数字最小1最大100, 求代码及思路

从 5 次掷骰子中,生成一个范围为 [1 - 100] 的随机数

列出 1-50 范围内的 50 个随机数,这样相邻的数字之间的距离不在 15 以内

php生成随机数字,范围1-100,每次生成一个数字,可以重复

练习题5:水仙花数

在线性时间内对 0 到 n^2 – 1 范围内的 n 个数字进行排序