查找范围之间的数字的倍数[Java]

时间:2015-08-07 06:18:17

标签: java performance numbers

我们已经给出了 A< = B 的范围和 M 的数字。我们必须找到给定范围内M的多少倍。

我的解决方案:

import java.util.Scanner;

class ABC {
public static void main(String args[] ) throws Exception {

    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    for (int i = 0; i < N; i++) {
        long A = sc.nextLong();
        long B = sc.nextLong();
        long M = sc.nextLong();

        int res = 0;
        while(A<=B)
        {
            if(A%M==0)res++;
            A++;
        }
        System.out.println(res+"");
    }
    }
}

现在这不是很有效率。请告诉我如何在最短的时间内解决这个问题。

3 个答案:

答案 0 :(得分:3)

最小整数n1使得n1 *M≥A是n1 = ceil(A / M),并且最大整数n2使得n2 *M≤B是n2 = floor(B / M)。 n1和n2之间的整数个数是max_of(n2-n1 + 1; 0)。

结合上述内容我们得到答案:

max_of(floor(Z / X)-ceil(Y / X)+1; 0)

这是竞争性节目中的一个标准问题:D

答案 1 :(得分:1)

以下应该做(经过一些更多的测试)。

int r = (b/m - a/m) + (a % m == 0 ? 1 : 0);

解释

  1. ma/m
  2. 之间查找倍数b/m
  3. 如果am的倍数,则再添加一个(a % m == 0 ? 1 : 0)
  4. 小例子PoC

    public static void main(String[] args) throws Exception {
        int[][] pairs = {{10, 24}, {10, 25}, {11, 24}, {11, 25}, {10, 27}};
        int m = 5;
        for (int[] pair : pairs) {
            int a = pair[0];
            int b = pair[1];
            int r = (b/m - a/m) + (a % m == 0 ? 1 : 0);
            System.out.printf("a: %d  b: %d  result = %d  ", a, b, r);
            for (int i = a; i <= b; i++) {
                if (i % m == 0) {
                    System.out.print(" " + i);
                }
            }
            System.out.println("");
        }
    }
    

    <强>输出

    a: 10  b: 24  result = 3   10 15 20
    a: 10  b: 25  result = 4   10 15 20 25
    a: 11  b: 24  result = 2   15 20
    a: 11  b: 25  result = 3   15 20 25
    a: 10  b: 27  result = 4   10 15 20 25
    

答案 2 :(得分:1)

试试这段代码:

long A = sc.nextLong();
    long B = sc.nextLong();
    long M = sc.nextLong();

    if (M > A) {
        A = M;
    }
    if(M > B){
        System.out.println("0");
        return;
    }
    System.out.println(  (((B-A)/M)+1) + "");

说明:

如果2是第一个倍数而不是我们不需要检查3,我们必须添加2来获得下一个多数,所以我们不需要从第一个值遍历到最后一个并检查值是否为多个,我们只需要找到第一个多个步骤,而不是多个步骤来达到最后一个数字意味着我们的B通过将M添加到A。