我需要找到从基数开始的数字的第一个倍数。例如:7中3的第一个倍数是9.我的第一次尝试就是这样做:
multiple = baseNumber
while(multiple%number !=0 )
multiple++
最后,“倍数”将在number
之后获得baseNumber
的第一个倍数。问题是当number
变得太大时,迭代次数变得太多。所以我的问题是:有更快的方法吗?
答案 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即将出现在这里。