Java - 倍数程序

时间:2014-11-08 10:58:17

标签: java selection intersection

所以我在一些帮助下修改了我的程序(从这个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);

    }
}   

我的程序适用于某些示例,而其他程序则完全失败..

1 个答案:

答案 0 :(得分:0)

首先,您应该注意到您的原始问题是包容性的。也就是说,如果xy本身可以被其中一个数字整除,则它们会包含在计数中。

这意味着您无法使用z = (y-x),因为这实际上排除了其中一个。假设x为14且y为16.结果为3 - 数字14,15和16都可以被2,3或5整除。如果你计算'yx'你就是只有2开始。

但是,这不是唯一的问题。问题是z/2z/3等不会给出范围内可分割数的确切数量。考虑x和y实际上是什么非常重要。例如,让我们举两个例子,差异是23。

示例1 - x = 11,y = 33

  • 我们将z计算为33-11+1(添加一个包含的内容),即23。
  • 想要在此时间间隔内找到可被5整除的数字的数量,我们计算z/5,得到4。
  • 实际上,该区间内的可分数 15,20,25,30 。四个数字,好!

示例2 - x = 9,y = 31

  • 我们将z计算为31-9+1,再次为23。
  • 我们再一次将z/5计算为4。
  • 但是这一次,该区间中可以被5整除的数字是: 10,15,20,25,30 。五个数字,而不是4个!

请注意,与上面的评论不同,本例中的数字x和y都不能被5整除。所以这不是一种找出它何时为4和何时为5的方法。

那我们该怎么做?

我们不计算x和y之间的差异。这会丢失信息。我们做的是不同的。我们发现在0和x(不包括)之间以及在0和y(包括)之间可被5整除的数字的数量。这两个数字之间的差异正是y和x之间可被5整除的数字的数量。让我们用上面的两个例子来证明。

示例1 - x = 11,y = 33

  • 所有数字k是多少,k > 0k < x以及k可以被5整除?数字是5和10.这是2个数字。
  • 所有数字j是多少,j > 0j ≤ y以及j可以被5整除?数字是5,10,15,20,25,30。这是6个数字。
  • 我们在x中找到的数字5和10对我们不感兴趣,因为它们不在我们的间隔中。因此,在6个数字中,我们排除了两个,剩下4个:15,20,25,30。

示例2 - x = 9,y = 31

  • 找到9的k个数字。这些数字仅包含数字5.所以我们有1个数字。
  • 找到31的j个数字。再次是6个数字5,10,15,20,25,30。
  • 从6减去1(这次只是1)我们有5.实际上,9到31之间有5个数字可以被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;