查找下一个多个的算法

时间:2011-11-08 22:11:03

标签: algorithm math pseudocode

给定两个正整数x和y,我需要找到大于或等于x的下一个数字,它是y的倍数。

例如:

  

x = 18,y = 3 => 18

  

x = 18,y = 5 => 20

  

x = 121,y = 25 => 125

我的第一个想法是继续增加x直到我找到一个匹配但是对于高y值来说效率相当低。

然后我想到了x - (x % y) + y但是如果x是y的倍数则不会有效。当然,我总是可以使用公式x - ((x % y)==0?y:x % y) + y中的三元运算符进行调整。

有没有人有任何好的,聪明的,简单的建议或完整的解决方案比我所提到的更好?我错过了我的逻辑中明显的东西吗?

我将使用Java(这是一个更大的算法的一小部分),但如果它是完全直接的数学,伪代码将同样有用。

4 个答案:

答案 0 :(得分:5)

如果xy为肯定int,那么这将有效:

y * ((x-1)/y + 1);

使用x-1可让您在xy的倍数时不必担心特殊情况。例如,如果是y = 5,则为16 <= x <= 20

15 <= x-1 <= 19
(x-1)/y == 3
(x-1)/y+1 == 4
y*((x-1)/y+1) == 20

答案 1 :(得分:3)

嗯,那怎么样?

tmp = ceil(x / y);
result = y * tmp;

答案 2 :(得分:1)

假设x和y大于零。

数学公式非常简单: Ceil(x / y)* y

其中Ceil(x)是大于或等于指定实数的最小整数值

在Java中,您可以使用函数Math.ceil()来实现此目的: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#ceil(double

答案 3 :(得分:0)

感谢您的回复。到目前为止,我只是运气好我的原始解决方案,但我仍然希望看到更好的东西。这是一个简单的测试类,我试图帮助推动创意:

package com.scratch;

import java.util.ArrayList;
import java.util.List;

public class Test {
    private static class Values {
        long x;
        long y;
        long result;

        Values(long x, long y, long result) {
            this.x = x;
            this.y = y;
            this.result = result;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<Values> list = new ArrayList<Values>();
        Values v1 = new Values(18, 3, 18);
        list.add(v1);
        Values v2 = new Values(18, 5, 20);
        list.add(v2);
        Values v3 = new Values(121, 25, 125);
        list.add(v3);
        Values v4 = new Values(9999999, 10, 10000000);
        list.add(v4);

        Operation operation = new MyFormula();
        // Operation operation = new RecommendedFormula();
            // Operation operation = new RecommendedFormula2();
        for (Values v : list) {
            System.out.println(v.x + ", " + v.y + " => " + v.result + "?");
            long res = operation.perform(v.x, v.y);
            System.out.println(res == v.result ? "worked" : "nope... Expected "
                    + v.result + ", got " + res);
        }
    }

    private static interface Operation {
        long perform(long x, long y);
    }

    private static class MyFormula implements Operation {

        @Override
        public long perform(long x, long y) {
            return x - ((x % y) == 0 ? y : x % y) + y;
        }

    }

    private static class RecommendedFormula implements Operation {

        @Override
        public long perform(long x, long y) {
            return (long) (Math.ceil(x / y) * y);
        }

    }

private static class RecommendedFormula2 implements Operation{

        @Override
        public long perform(long x, long y) {
            return x + (y - x % y) % y;
        }

    }

}

MyFormula(问题中)似乎工作正常。 RecommendedFormula没有,但这可能只是因为我使用的类型(这是我需要在成品中使用的)。