【问题标题】:Numbers counting function数字计数功能
【发布时间】:2014-11-07 17:43:55
【问题描述】:

我在学校有这个作业;我们将在 java 中编写一个简单的程序/方法/算法,让我们接受两个数字输入并输出两个输入之间范围内的所有数字的计数,这些数字可以被 2 或 3 或 5 整除。

分配相当简单,因为您只需遍历范围内的所有数字并在满足所有条件时递增计数器。

但我们还获得了 10 个测试输入和一个评估算法效率的计时器。前八个失败,因为八个值

于是我开始思考素数计数函数的方向并筛选 Eratosthenes,但我的头开始疼。关于更快但仍然足够简单的算法的任何想法?

【问题讨论】:

    标签: java algorithm sieve


    【解决方案1】:

    我想出了类似的东西

    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 个数字相加。

    【讨论】:

    • 为什么不只计算end / 30,因为任何能被 2、3 和 5 整除的数都必须能被 30 = 2 * 3 * 5 整除?
    • 在任何情况下,练习的一个要点似乎是表明确定某些事物有多少与找到所有这些事物不同,正如这个答案所表明的那样。跨度>
    • @JohnBollinger 这取决于您如何阅读问题,没有明确说明。答案找到可被 2 被 3 被 5 整除的数字的计数(或被其中一个以上)。但是,如果您将问题理解为“寻找可被 2 整除的数字,可被 3 整除的数字,可被 5 整除的数字,然后把它们都数一遍”,这在数学上是不精确的,但在非正式英语中是可以的。
    • 并且,...这被称为inclusion-exclusion principle
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多