当前位置: 首页 > 知识库问答 >
问题:

夹紧到系列中的下一个最低值

宗苗宣
2023-03-14

我试图将一个数钳制为一系列数的较低值。例如,如果我有一个系列(对不起,记法不好)

[pq]其中p是任意整数,q是任意正数。

假设q是50,我的系列将是-150, -100, -50, 0, 50, 100, 150

现在我想要的是有一个函数f(y),它将把任何数字钳制到序列中下一个最低的数字。

例如,如果我有一个数字37,我会期待f(37)=0,我会期待f(-37)=-50

我尝试过许多涉及模和整数除法的算法,但我似乎弄不懂。我最近试过的例子就是

(37/q)*q这对正数非常有效,但对-50到0之间的任何数字都不起作用。

我也尝试过((37-q)/q)*q,但这对完全在系列中出现的阴性病例不起作用。

编辑

假设我没有整个序列,只有序列的乘法器p

共有3个答案

段干安和
2023-03-14

一旦确定了模数结果为正,就可以减去它。在某些语言中,它总是积极的,但如果不是:

mod = p % q
positive_mod = (mod + q) % q
answer = p - positive_mod

结果C:https://ideone.com/kIuit8

在Python中生成:https://ideone.com/w6wUgZ

史谦
2023-03-14

如果你想要一种纯粹的数学方法,而不考虑计算效率,你可以通过添加一个大于或等于|p |且是q的倍数的正整数,将输入的p移到正整数范围内,然后再通过减法将其移回p^2*q满足了这一点。

这就给出了:((p^2*q)/q)*q-p^2*q

锺星腾
2023-03-14

您只需使用整数欧几里得除法将y除以q,然后再次将结果乘以q

f(y) = (y / q) * q

其中,/表示欧几里得除法。

在不立即支持欧氏除法的编程语言中,您必须手动实现它,或者调整语言支持的任何除法的结果。

例如,在C和C中,正除数的欧几里德除法q可以通过原生的“Fortran风格”除法实现,如下所示:

 (y >= 0 ? y : y - q + 1) / q

所以在C或C中,整个表达式看起来像

f(y) = (y >= 0 ? y : y - q + 1) / q * q

对于37你得到

f(37) = 37 / 50 * 50 = 0

对于-37你得到

f(-37) = (-37 - 50 + 1) / 50 * 50 = -86 / 50 * 50 = -50
 类似资料:
  • 问题内容: 我想按从高到低的顺序进行排序。 问题答案: java.util.Collections.sort(列表,比较器) 您将需要写一个

  • 问题内容: 我正在寻找有关如何在Python中将一个范围值转换为另一范围值的想法。我正在从事硬件项目,正在从可返回一定范围值的传感器读取数据,然后使用该数据来驱动需要不同范围值的执行器。 例如,假设传感器返回的值在1到512的范围内,并且执行器由5到10的值驱动。我想要一个函数,我可以传递一个值和两个范围并取回该值映射到第二个范围。如果这样的函数被命名,则可以这样使用: 在此示例中,我希望输出为,

  • 我可以用什么代码打印出用户在这个数组中输入的最高值和最低值?这个程序需要取用户输入的平均值(我已经做过了)。现在我所需要做的就是让程序打印出用户输入的最高值和最低值。

  • 本文向大家介绍在Scala中找到列表的最后一个元素,包括了在Scala中找到列表的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 假设我们在Scala中有一个列表,该列表在scala.collection.immutable包下定义。众所周知,列表是相同类型元素的集合,其中包含不可变(不可更改)数据。我们通常应用last函数来显示列表的最后一个元素。 使用最后一个关键字 以下Scala代码显

  • 紧急联系人 基本描述 紧急联系人是乘车人在遇到紧急情况时向其发起帮助请求的人。设置紧急联系人时,可选择在特定时间段内开启自动行程分享功能。在该时段内,车辆位置和行程信息会通过短信自动分享给紧急联系人。在完成添加紧急联系人的情况下,乘车过程中乘车人如果触发紧急状态(如使用一键报警功能),系统会给乘客设置的所有紧急联系人发送短信,并在滴滴侧启动相应安全防护措施,最大程度地保护乘车人安全。紧急情况下,紧

  • 我是java新手,我创建了两个arraylists,然后在while循环中向用户请求一个数字,一旦我从第1点和第2点获得了所需数量的数字。我将arrayllists转换为数组。我需要比较两个点阵,然后将最低点的缺失数字设置为零。例如 点1=(12,123,123,435,6756,667)//6个数字 点 2=(23,13,35)//3 个数字 点 3=(23,13,35,0,0,0)//新数组替