Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找范围[Java]之间的数字的倍数_Java_Performance_Numbers - Fatal编程技术网

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

查找范围[Java]之间的数字的倍数,java,performance,numbers,Java,Performance,Numbers,我们得到了一个范围a最小整数n1,使得n1*M≥ A是n1=ceil(A/M),并且是最大的整数n2,因此n2*M≤ B为n2=地板(B/M)。n1和n2(含)之间的整数数为(n2)的最大值−n1+1;0) 综合上述情况,我们得出了答案: (地板)的最大面积(Z/X)−ceil(Y/X)+1;0) 这是竞争性编程中的一个标准问题:D应该这样做(经过更多测试) 解释 查找a/m和b/m之间的倍数m 如果a是m的倍数再添加一个(a%m==0?1:0) 小示例PoC public static voi

我们得到了一个范围a最小整数n1,使得n1*M≥ A是n1=ceil(A/M),并且是最大的整数n2,因此n2*M≤ B为n2=地板(B/M)。n1和n2(含)之间的整数数为(n2)的最大值−n1+1;0)

综合上述情况,我们得出了答案:

(地板)的最大面积(Z/X)−ceil(Y/X)+1;0)

这是竞争性编程中的一个标准问题:D

应该这样做(经过更多测试)

解释

  • 查找
    a/m
    b/m
    之间的倍数
    m
  • 如果
    a
    m的倍数
    再添加一个
    (a%m==0?1:0)
  • 小示例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("");
        }
    }
    
    请尝试以下代码:

    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来获得下一个倍数,这样我们就不需要从第一个值遍历到最后一个值并检查值是否是倍数,我们只需要找到第一个倍数,然后通过将M添加到A,达到最后一个数所需的步骤数就意味着我们的B。

    那么
    (B-A)呢/M
    ?如果A和B应考虑在范围内,则应额外处理。还有其他边缘情况,其中M>B,M>(B-A),…对不起,我不理解你关于
    (B-A)/M
    的问题。有可能a==B。。。。在这种情况下,B-A总是可以被MAssume
    A=10
    B=23
    M=5
    整除,结果(基于您的代码片段)应该是
    3
    。所以
    (23-10)/5
    会给你
    2
    ,当
    10可以被5整除时,你再加一个。假设
    A=5
    B=10
    M=3
    <代码>(10-5)/3
    为我们提供了
    1
    。10或5都不能被3整除。。。但正确答案应该是2。。。不是1
    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
    
    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) + "");