快速找到下一个数字的倍数

时间:2012-07-27 17:38:23

标签: objective-c c math

我需要找到从基数开始的数字的第一个倍数。例如:7中3的第一个倍数是9.我的第一次尝试就是这样做:

multiple = baseNumber
while(multiple%number !=0 )
    multiple++

最后,“倍数”将在number之后获得baseNumber的第一个倍数。问题是当number变得太大时,迭代次数变得太多。所以我的问题是:有更快的方法吗?

4 个答案:

答案 0 :(得分:21)

如果一切都保证是积极的,请尝试

multiple = baseNumber + number - 1;
multiple -= (multiple % number);

这是在恒定时间内完成的。

首先,我们添加number - 1以确保我们的数字至少与下一个数字一样大但小于之后的数字。然后我们用number减去除法的余数,以确保我们有所需的倍数。

如果baseNumber可能是否定的(但number仍为正数),我们会遇到multiple % number multiple < 0可能为负的问题,因此以上内容可能会跳过多个number。为避免这种情况,我们可以使用例如。

remainder = multiple % number;
if (remainder < 0) remainder += number;
multiple -= remainder;

如果分支过于昂贵,我们可以避免使用if代价两个分部,而不是一分,

multiple -= (number + (multiple % number)) % number;

一般来说,if似乎更可取。

如果number可能为负数,请先将其替换为绝对值。

注意:如上所述,baseNumber如果已经是number的倍数,则会返回上面的- 1。如果不需要,请删除第一行中的{{1}}。

答案 1 :(得分:4)

试试这个(需要INTEGER部门):

multiple = ((base/number) + 1) * number;

7/3 = 2. 3 *(2 + 1)= 9.

您有一个边缘情况,baseNumber已经是number的倍数,您必须使用模数运算进行测试。

答案 2 :(得分:3)

为什么需要循环?

multiple =(floor(number / baseNumber)+1)* baseNumber

答案 3 :(得分:0)

 while(multiple * number < baseNumber)
      multiple++;

所以对于baseNumber = 3,number = 7,你的倍数是3;

但是,有些东西告诉我bignums即将出现在这里。