我们已经给出了 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+"");
}
}
}
现在这不是很有效率。请告诉我如何在最短的时间内解决这个问题。
答案 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);
解释
m
和a/m
b/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("");
}
}
<强>输出强>
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。