我们已经给出了一个值域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+"");
}
}
}
现在这不是很有效率。请告诉我如何能在最短的时间内解决这个问题。
4条答案
按热度按时间sulc1iza1#
最小整数n1使得n1M ≥ A为n1=ceil(A/M),最大整数n2使得n2M ≤ B为n2=floor(B/M),n1和n2之间的整数个数为max_of(n2−n1+1 ; 0)。
综合以上几点,我们得出了答案:
(下限(Z/X)-上限(Y/X)+1)的最大值; 0)
这是竞争性编程中的标准问题:D
x7rlezfr2#
下面应该可以做到这一点(经过一些更多的测试)。
解说
1.求出
a/m
和b/m
之间的倍数m
1.如果
a
是m
倍数,则再加上一个(a % m == 0 ? 1 : 0)
小型PoC示例
输出
uhry853o3#
请尝试以下代码:
说明:
如果2是第一个倍数,那么我们不需要检查3,我们必须加上2以得到下一个倍数,因此我们不需要从第一个值遍历到最后一个值并检查值是否是倍数,我们只需要找到第一个倍数,然后通过将M加到A,到达最后一个数所需的步数意味着我们的B。
snz8szmq4#
这个很好用。
只要y〉x,如果不总是这样,只需添加一个额外的if语句,检查y〉x还是x〉y。