设计JAVA application程序,计算出20000000~300000000之间所有的素数,并将找到的素数写入primefile.dat文件,
以下是一个使用Java语言编写的程序,可以计算出20000000~300000000之间所有的素数,并将找到的素数写入primefile.dat文件:
javaCopy code
import java.io.FileOutputStreamimport java.io.IOExceptionpublic class PrimeNumberCalculator { public static void main(String[] args) { int start = 20000000int end = 300000000String filename = "primefile.dat"try (FileOutputStream fileOutputStream = new FileOutputStream(filename)) { for (int i = starti <= endi++) { if (isPrime(i)) { fileOutputStream.write(String.valueOf(i).getBytes())fileOutputStream.write(System.lineSeparator().getBytes())} } } catch (IOException e) { e.printStackTrace()} } private static boolean isPrime(int n) { if (n <= 1) { return false} for (int i = 2i <= Math.sqrt(n)i++) { if (n % i == 0) { return false} } return true} }
该程序首先定义了起始数字和终止数字,以及文件名。接下来,在main方法中,程序使用for循环迭代从start到end之间的每个数字。对于每个数字,程序调用isPrime方法来判断它是否为素数。如果是素数,程序将该数字写入文件中,每个数字占一行。
isPrime方法使用了一个简单的算法来判断一个数字是否为素数:如果数字小于或等于1,那么它不是素数。否则,程序从2开始,一直到该数字的平方根之间的每个数字进行除法运算。如果该数字能被任何一个这些数字整除,那么它不是素数。
请注意,在此程序中,我们使用了Java 7引入的"try-with-resources"语句来自动关闭文件输出流。这样可以确保即使在发生异常的情况下,文件输出流也会被正确关闭,以避免文件被损坏。
1.内部使用 C 的 longjmp 机制让出一个协程。 因此,如果一个 C 函数 foo 调用了一个 API 函数, 而这个 API 函数让出了(直接或间接调用了让出函数)。 由于 longjmp 会移除 C 栈的栈帧, Lua 就无法返回到 foo 里了。
2.为了回避这类问题, 碰到 API 调用中调用让出时,除了那些抛出错误的 API 外,还提供了三个函数: lua_yieldk, lua_callk,和 lua_pcallk 。 它们在让出发生时,可以从传入的 延续函数 (名为 k 的参数)继续运行。
3.我们需要预设一些术语来解释延续点。 对于从 Lua 中调用的 C 函数,我们称之为 原函数。 从这个原函数中调用的上面所述的三个 C API 函数我们称之为 被调函数。 被调函数可以使当前线程让出。 (让出发生在被调函数是 lua_yieldk, 或传入 lua_callk 或 lua_pcallk 的函数调用了让出时。)
4.假设正在运行的线程在执行被调函数时让出。 当再次延续这条线程,它希望继续被调函数的运行。 然而,被调函数不可能返回到原函数中。 这是因为之前的让出 *** 作破坏了 C 栈的栈帧。 作为替代品,Lua 调用那个作为被调函数参数给出的 延续函数 。 正如其名,延续函数将延续原函数的任务。
5.注意这里那个额外的显式的对延续函数的调用:Lua 仅在需要时,这可能是由错误导致的也可能是发生了让出而需要继续运行,才会调用延续函数。 如果没有发生过任何让出,调用的函数正常返回, 那么 lua_pcallk (以及 lua_callk)也会正常返回。 (当然,这个例子中你也可以不在之后调用延续函数, 而是在原函数的调用后直接写上需要做的工作。)
6.Lua 会把延续函数看作原函数。 延续函数将接收到和原函数相同的 Lua 栈,其接收到的 lua 状态也和 被调函数若返回后应该有的状态一致。 (例如, lua_callk 调用之后, 栈中之前压入的函数和调用参数都被调用产生的返回值所替代。) 这时也有相同的上值。 等到它返回的时候,Lua 会将其看待成原函数的返回去 *** 作。
7.我们需要预设一些术语来解释延续点。 对于从 Lua 中调用的 C 函数,我们称之为 原函数。 从这个原函数中调用的上面所述的三个 C API 函数我们称之为 被调函数。 被调函数可以使当前线程让出。 (让出发生在被调函数是 lua_yieldk, 或传入 lua_callk 或 lua_pcallk 的函数调用了让出时。)
8.假设正在运行的线程在执行被调函数时让出。 当再次延续这条线程,它希望继续被调函数的运行。 然而,被调函数不可能返回到原函数中。 这是因为之前的让出 *** 作破坏了 C 栈的栈帧。 作为替代品,Lua 调用那个作为被调函数参数给出的 延续函数 。 正如其名,延续函数将延续原函数的任务。
希望能帮到你,谢谢!
Java是一门计算机编程语言,面向对象的编程语言。Java可以开发后端,有spring,springmvc,springboot,springcould等等都是使用Java开发。Java也有前端框架,有Jquery,JavaScript,JSP,Servlet,统称JavaWEB开发。使用Java编写一个程序很简单,按照相关的模板,加上业务代码就可以实现一套系统。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)