所以我在一些帮助下修改了我的程序(从这个question),但是对于一些示例输入数字,最后的结果是不正确的。
程序接收两个数字作为输入,并且必须找到它们之间有多少数字可以被2,3或5整除。
import java.util.*;
public class Multiples {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long x = sc.nextLong(); // first input number
long y = sc.nextLong(); // second input number
long num = 0;
long z = (y-x); // the numbers between y and x
long a = z/2; // numbers divisible by 2
long b = z/3; // numbers divisible by 3
long c = z/5; // numbers divisible by 5
long d = z/(2*3); // intersections
long e = z/(2*5);
long f = z/(3*5);
long g = z/(2*3*5);
num = a+b+c-d-e-f+g; // we add up the multitudes of a and b and c and we subtract the intersections of d and e and f and add up the intersection of g
System.out.println(num);
}
}
我的程序适用于某些示例,而其他程序则完全失败..
答案 0 :(得分:0)
首先,您应该注意到您的原始问题是包容性的。也就是说,如果x
或y
本身可以被其中一个数字整除,则它们会包含在计数中。
这意味着您无法使用z = (y-x)
,因为这实际上排除了其中一个。假设x
为14且y
为16.结果为3 - 数字14,15和16都可以被2,3或5整除。如果你计算'yx'你就是只有2开始。
但是,这不是唯一的问题。问题是z/2
,z/3
等不会给出范围内可分割数的确切数量。考虑x和y实际上是什么非常重要。例如,让我们举两个例子,差异是23。
示例1 - x = 11,y = 33
z
计算为33-11+1
(添加一个包含的内容),即23。z/5
,得到4。示例2 - x = 9,y = 31
z
计算为31-9+1
,再次为23。z/5
计算为4。请注意,与上面的评论不同,本例中的数字x和y都不能被5整除。所以这不是一种找出它何时为4和何时为5的方法。
那我们该怎么做?
我们不计算x和y之间的差异。这会丢失信息。我们做的是不同的。我们发现在0和x(不包括)之间以及在0和y(包括)之间可被5整除的数字的数量。这两个数字之间的差异正是y和x之间可被5整除的数字的数量。让我们用上面的两个例子来证明。
示例1 - x = 11,y = 33
k
是多少,k > 0
和k < x
以及k可以被5整除?数字是5和10.这是2个数字。j
是多少,j > 0
和j ≤ y
以及j可以被5整除?数字是5,10,15,20,25,30。这是6个数字。示例2 - x = 9,y = 31
k
个数字。这些数字仅包含数字5.所以我们有1个数字。j
个数字。再次是6个数字5,10,15,20,25,30。那么,我们如何使用java来计算呢?
对于任何数字n,在0和它自身之间可被5整除的数字的数量,包括它自身的数字,如果它是可分的,则恰好是n/5
(整数除法)。为什么?我会留下让你考虑的,但基本上是因为从1开始,总有四个不可分割的,一个可分的,四个不可分割的,一个可分的直到n
。
要排除自身,即使它可以整除,也可以(n-1)/5
。因此,如果您的号码为10,并且您不想考虑它,请取9号并获得正确的号码。
当然,所有这些讨论都适用于任何数字,而不仅仅是五个。所以这是一个计算x和y之间有多少可分数的小方法:
private static long findDivisibles( long x, long y, long divisor ) {
return y / divisor - (x-1) / divisor;
}
现在您可以更正您的计划:
long div2 = findDivisibles( x, y, 2 );
long div3 = findDivisibles( x, y, 3 );
long div5 = findDivisibles( x, y, 5 );
long div23 = findDivisibles( x, y, 2*3 );
long div35 = findDivisibles( x, y, 3*5 );
long div25 = findDivisibles( x, y, 2*5 );
long div235 = findDivisibles( x, y, 2*3*5 );
num = div2 + div3 + div5 - div23 - div35 - div25 + div235;