java(for循环)有没有更简单的算法,比如直接算出来质数,不写第二个for循环?

2025-04-03 09:07:10
推荐回答(1个)
回答1:

不写第二个for循环是不可能的(目前人类的数学而言)!除非你是已经把结果存在一个数组里,那就相当于已知答案求答案,也没有意义了。或者是用一个子函数代替了第二个for循环,或者用while之类的,那是钻牛角尖,本质上还是循环

因为还没有研究出任何的连续质数的准确的递推关系式,(有质数分布规律的关系式,但不是100%准确的)

所以,只能假设这个数可能是质数,再来求证。

不过你的程序可以做下列改进,大大加快执行速度:

第二个for循环:

for (int j = 2; j < i; j++) {

j不需要遍历到i-1,只要遍历到 根号i的向下取整就够了。因为:如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。这样一来时间复杂度有O(n^2)降低到O(n^1.5)

而且j也一样,可以直接从3开始除,j+=2。因为你i都已经是奇数了,i/2还要判断吗?

所以第二个for循环可以改为:

//sqrt_i 如果不提前算好,把sqrt函数搞进第二个for循环去遍历,计算量会非常的大!其实还可以自己用乘法试乘来代替此语句,因为i是单调递增的,sqrt_i也必然是。
int sqrt_i=(int) sqrt((double) i );    
for (int j = 3; j < sqrt_i; j+=2 ) {
//...

事实上,j不需要等于所有奇数,只要等于所有质数就行了,但搞质数的程序比较麻烦,而且该程序规模不大,没有必要。