Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计数功能_Java_Algorithm_Sieve - Fatal编程技术网

Java 计数功能

Java 计数功能,java,algorithm,sieve,Java,Algorithm,Sieve,我在学校有这个作业;我们将用java编写一个简单的程序/方法/算法,让我们获取两个数字输入,并对两个输入之间可除以2、3或5的范围内的所有数字进行输出计数 赋值相当简单,因为只要满足所有条件,您就可以迭代范围内的所有数字并递增计数器 但我们也得到了10个测试输入和一个计时器,用来评估我们算法的效率。前八个失败了,因为这八个值

我在学校有这个作业;我们将用java编写一个简单的程序/方法/算法,让我们获取两个数字输入,并对两个输入之间可除以2、3或5的范围内的所有数字进行输出计数

赋值相当简单,因为只要满足所有条件,您就可以迭代范围内的所有数字并递增计数器

但我们也得到了10个测试输入和一个计时器,用来评估我们算法的效率。前八个失败了,因为这八个值<10^6。但最后两个测试输入值<10^18,我的算法失败


所以我开始思考质数计数函数和筛出埃拉托斯烯的方向,但我的头开始痛了。关于一个更快但仍然足够简单的算法有什么想法吗?

我想到了类似的想法

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整除的数字,以及在第2步中被丢弃的数字,所以我们每30个数字相加一次

    • 我想出了类似的办法

      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整除的数字,以及在第2步中被丢弃的数字,所以我们每30个数字相加一次

      为什么不直接计算
      end/30
      ,因为任何可被2、3和5整除的数字都必须被30=2*3*5整除?在任何情况下,这个练习的一点似乎是要表明,确定某个事物的数量与找到所有这些事物并不相同,正如这个答案所表明的那样,@JohnBollinger,这取决于你如何理解这个问题,而这个问题并没有明确说明。答案找到可被2、3或5(或其中一个以上)整除的数字的计数。但是如果你把这个问题理解为“寻找那些可以被2整除的数字,那些可以被3整除的数字,还有那些可以被5整除的数字,然后把它们全部数完”,这在数学上是不精确的,但在非正式英语中是可以的。。。这就是所谓的“为什么不直接计算”
      end/30
      ,因为任何可被2、3和5整除的数字都必须被30=2*3*5整除?无论如何,这个练习的一点似乎是要表明,确定某个事物的数量与找到所有这些事物并不相同,正如这个答案所表明的那样,@JohnBollinger,这取决于你如何理解这个问题,而这个问题并没有明确说明。答案找到可被2、3或5(或其中一个以上)整除的数字的计数。但是如果你把这个问题理解为“寻找那些可以被2整除的数字,那些可以被3整除的数字,还有那些可以被5整除的数字,然后把它们全部数完”,这在数学上是不精确的,但在非正式英语中是可以的。。。这就是所谓的,,