【问题标题】:How to Make Prime Generator Code More Efficient如何使 Prime 生成器代码更高效
【发布时间】:2015-03-14 07:17:40
【问题描述】:

作为 Scala 的初学者,我在 SPOJ 中遇到了问题:

Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate all prime numbers between two given numbers!

输入

输入以单行中的测试用例数量 t (t

输出

对于每个测试用例打印所有质数 p 使得 m

例子

输入:
2
1 10
3 5

输出:
2
3
5
7

3
5
` 警告:大量输入/输出数据,请注意某些语言(但如果算法设计良好,大多数应该没问题)

运行环境及要求:

添加者:Adam Dzedzej
日期:2004-05-01
时限:6s
源限制:50000B
内存限制:1536MB
集群:Cube(英特尔奔腾 G860 3GHz)
语言:除了:NODEJS PERL 6 SCM 鸡

我的代码在这里:

import math.sqrt

object Pro_2 {
  def main(args: Array[String]) {

    // judge whether a Long is a prime or not
    def isPrime(num: Long): Boolean = {
      num match {
        case num if (num < 2) => false
        case _ => {
          2 to (sqrt(num) toInt) forall (num % _ != 0)
        }
      }
    }

    // if a Long is a prime print it in console
    def printIfIsPrime(num: Long) = {
      if (isPrime(num))
        println(num)
    }

    // get range
    def getInput(times: Int) = {
      for (input <- 0 until times) yield {
        val range = readLine().split(" ")
       (range(0) toLong, range(1) toLong)
      }
    }

    val ranges = getInput(readInt())
    for (time <- 0 until ranges.length) {
      (ranges(time)._1 to ranges(time)._2).foreach(printIfIsPrime(_))
      if (time != ranges.length - 1)
        println()
    }

  }
}

当我在 SPOJ 中运行我的代码时,我得到了一个结果:time limit exceeded

我需要让我的代码更高效,你能帮帮我吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: scala


    【解决方案1】:

    isPrime 可以写成较低级别的样式。您还可以提高 println 方法的速度。

    def main(args: Array[String]) {
      val out = new java.io.PrintWriter(System.out, false)
    
      def isPrime(n: Long): Boolean = {
        if(n <= 3) return n > 1
        else if(n%2 == 0 || n%3 == 0) return false
        else {
          var i = 5
          while(i*i <= n) {
            if(n%i == 0 || n%(i+2) == 0) return false
            i += 6
          }
          return true
        }
      }
    
      def printIfIsPrime(num: Long) = {
        if (isPrime(num)) {
          out.println(num)
        }
      }
      ...
      val ranges = getInput(readInt())
      for (time <- 0 until ranges.length) {
        (ranges(time)._1 to ranges(time)._2).foreach(printIfIsPrime(_))
        if (time != ranges.length - 1)
          out.println()
      }
      out.flush()
    }
    

    【讨论】:

    • 性能优化是预先计算 sqrt(n),存储在一个变量中并将其与 i 进行比较,而不是重复对 i 的新版本求平方。即 val rootN = sqrt(n) 和 while (i
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2015-07-27
    • 2019-07-28
    • 2015-02-25
    • 2016-03-05
    相关资源
    最近更新 更多