Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Math_Primes - Fatal编程技术网

Java 计算与不带数组的另一个数最接近的素数

Java 计算与不带数组的另一个数最接近的素数,java,math,primes,Java,Math,Primes,我有这个家庭作业,但我不能完成它,因为我只能使用关系运算符和if-else/while,我不能使用库和方法,只能使用关系运算符,如果或者while,我开始检查限制的数字是否为素数,首先检查2 3 5 7和11,然后我尝试在每个数的平方根之前使用%来确定它是否为素数,但这需要很多时间,我如何用更少的时间来计算它,对不起,这是一个罕见的解释 据我所知,如果没有数组,唯一的其他选择就是使用惰性列表,它可以用生成器来模拟。在伪代码中 primes = [2..] \ [[p*p, p*p+p, ...]

我有这个家庭作业,但我不能完成它,因为我只能使用关系运算符和if-else/while,我不能使用库和方法,只能使用关系运算符,如果或者while,我开始检查限制的数字是否为素数,首先检查2 3 5 7和11,然后我尝试在每个数的平方根之前使用%来确定它是否为素数,但这需要很多时间,我如何用更少的时间来计算它,对不起,这是一个罕见的解释

据我所知,如果没有数组,唯一的其他选择就是使用惰性列表,它可以用生成器来模拟。在伪代码中

primes = [2..] \ [[p*p, p*p+p, ...] for p in primes]
从一开始,这就变成了

primesFrom n = [n..] \ unionAll(
                    [[s,s+p..] for each p in psq
                               where psq = primes upto (2 * sqrt(n)),
                               where s   = div(n+p-1, p) * p] )
我们只需要它产生的第一个数字。这里的并集当然是一个有序的,给定有序的,不断增加的源,以有序的方式产生结果,从较小的值到较大的值一个接一个

平方根的两倍用于表示覆盖范围内的最大值。您可以通过为您的范围查找基本间隙的精确值来提高精度。
psq
素数可以通过试除法在生成器中逐个找到

但是现在您需要在某个地方维护这个生成器集合,并且仍然禁止使用数组

链接列表是一种可能性。它也可以通过嵌套的递归函数进行仿真,每个递归函数中都有本地静态存储,在初始化时创建它们的链,如

           = [n..] \ 
              ( [s1,s1+p1..] ∪
                ( [s2,s2+p2..] ∪
                  ( [s3,s3+p3..] ∪ (.... [sk,sk+pk..] ....))))
您可以看到一个示例,in Go,(and),尽管它实现了
\
s链(没有
s)

这可能是一件更容易做到的事情


虽然可以安排,为额外的。也许这是一个值得涉猎的有趣项目。

如果没有数组,唯一的选择就是使用惰性列表,我知道,使用某种类型的Eratosthenes筛选(希望比使用试算法进行素性测试更复杂),这可以用生成器来模拟。在伪代码中

primes = [2..] \ [[p*p, p*p+p, ...] for p in primes]
从一开始,这就变成了

primesFrom n = [n..] \ unionAll(
                    [[s,s+p..] for each p in psq
                               where psq = primes upto (2 * sqrt(n)),
                               where s   = div(n+p-1, p) * p] )
我们只需要它产生的第一个数字。这里的并集当然是一个有序的,给定有序的,不断增加的源,以有序的方式产生结果,从较小的值到较大的值一个接一个

平方根的两倍用于表示覆盖范围内的最大值。您可以通过为您的范围查找基本间隙的精确值来提高精度。
psq
素数可以通过试除法在生成器中逐个找到

但是现在您需要在某个地方维护这个生成器集合,并且仍然禁止使用数组

链接列表是一种可能性。它也可以通过嵌套的递归函数进行仿真,每个递归函数中都有本地静态存储,在初始化时创建它们的链,如

           = [n..] \ 
              ( [s1,s1+p1..] ∪
                ( [s2,s2+p2..] ∪
                  ( [s3,s3+p3..] ∪ (.... [sk,sk+pk..] ....))))
您可以看到一个示例,in Go,(and),尽管它实现了
\
s链(没有
s)

这可能是一件更容易做到的事情


虽然可以安排,为额外的。也许这是一个有趣的项目。

听起来更像是一个数学问题,看看这个,选择一个算法,用Java或Google实现这些算法中的一个,用Java实现你的问题很难理解。但我要告诉你一个事实。如果你需要你的代码快速,你要么必须使用数组(和一个筛选算法),要么使用一个概率素性测试,这涉及到一些复杂的数学。你确定你的老师要求你提供一个快速的程序吗?我怀疑他/她没有。。。。你只是让自己的生活变得困难!从老师的角度来看,本练习的重点是让学生学会使用算术、关系运算符和简单的控制结构编写程序。寻找素数的快速算法几乎肯定超出了编程入门课程的范围。我的建议是:按照要求去做,把节省下来的时间花在学习其他东西上。如果你好奇的话,这里有一个到概率素性测试的链接:但这通常只用于比整数范围大得多的数字,因为基本方法比整数范围快得多。听起来更像是一个数学问题,看看这个,然后选择一个算法,用Java或Google实现这些算法中的一个,用Java实现你的问题很难理解。但我要告诉你一个事实。如果你需要你的代码快速,你要么必须使用数组(和一个筛选算法),要么使用一个概率素性测试,这涉及到一些复杂的数学。你确定你的老师要求你提供一个快速的程序吗?我怀疑他/她没有。。。。你只是让自己的生活变得困难!从老师的角度来看,本练习的重点是让学生学会使用算术、关系运算符和简单的控制结构编写程序。寻找素数的快速算法几乎肯定超出了编程入门课程的范围。我的建议是:按照要求去做,把节省下来的时间花在学习其他东西上。如果你好奇的话,这里有一个到概率素性测试的链接:但这通常只适用于比整数范围大得多的数字,因为基本方法在这个范围下更快。