数字计数功能

时间:2014-11-07 17:43:56

标签: java algorithm sieve

我在学校有这个任务;我们要在java中编写一个简单的程序/方法/算法,它让我们获取两个数字输入和两个输入之间范围内所有数字的输出计数,这些数字可以被2或3或5分割。

分配非常简单,因为您可以遍历范围内的所有数字,并在满足所有条件时递增计数器。

但我们还获得了10个测试输入和一个评估算法效率的计时器。由于八个值<1,所以前八个落空了。 10 ^ 6。但是最后两个测试输入值是&lt; 10 ^ 18,我的算法失败了。

所以我开始考虑素数计数功能的方向并筛选Eratosthenes,但我的头开始受伤了。关于更快但仍然足够简单的算法的任何想法?

1 个答案:

答案 0 :(得分:4)

我想出了类似的东西

public static void main(String[] args) {
    long a = 123456789012345678L, b = 876543210987654321L;
    long score = getCount(b) - getCount(a - 1);
    System.out.println("Divisible by 2 or 3 or 5: " + score);
}

public static long getCount(long end) {
    return (end / 2) + (end / 3) + (end / 5) - ((end / 6)  + (end / 10) + (end / 15)) + (end / 30);
}

解决方案:

  • 它计算可分别用2或3或5整除的数量,并将其相加。
  • 现在我们需要丢弃两次计数的数字:对于2和3,它将是每第6个数字,2和5每10个数字,3和5每15个数字
  • 最后,我们需要包含可被2和3以及5整除的数字,这些数字在步骤2中被丢弃,因此我们每隔30个数字添加一次。