gpt4 book ai didi

java - Java 中更快的埃拉托斯特尼筛法和素数分解

转载 作者:行者123 更新时间:2023-12-01 06:19:30 25 4
gpt4 key购买 nike

我的输入是一个整数。达到该值时,应找到所有质数并将其打印在 5 列中,然后我必须对整数进行“质因数分解”并打印结果。

它工作正常,但它太慢了......

public class Bsp07 {
public static void main(String[] args) {

System.out.println("Enter the upper bound for prime number search");
int n = SavitchIn.readLineInt();
int[] aZahlen = new int[n - 1];
for (int el = 0, zahl = 2; el != n - 1; el++, zahl++)
aZahlen[el] = zahl;

int p = 2, altesP; // next unmarked number
boolean aus = false; // when unmarked elements are "aus" (off)

while (aus == false) {

// marks Elements; using For loop since for-each loop doesn't work
for (int i = 0; i < aZahlen.length; i++) {
if ((aZahlen[i] % p == 0) && (aZahlen[i] != p))
aZahlen[i] = 0;
}

altesP = p; // merkt sich altes p
// update p, find next unmarked Element
for (int el : aZahlen) {
if ((el != 0) && (el > altesP)) {
p = el;
break;
}
}
// if p stayed the same unmarked elements are "aus" (off)
if (altesP == p)
aus = true;
}

int nervVar = 0;
for (int pr : aZahlen) {
if(pr==0)
continue;
System.out.print(pr + " ");
nervVar++;
if ((nervVar % 5 == 0)) System.out.print("\n");
}

     /* Factorization */
System.out.print("\n" + n + " = ");
for (int i = 0, f = 0; n != 1; i++, f++) {
while(aZahlen[i]==0) i++;
/*
      * If the prime divides: divide by it, print the prime,
      * Counter for further continuous decrease with prime number if n = 1,
      * Stop
*/
if (n % aZahlen[i] == 0) {
n /= aZahlen[i];
        // So that the first time is not *
if (f != 0)
System.out.print(" * " + aZahlen[i]);
else
System.out.print(aZahlen[i]);
i--;
}
        // So that f remains zero if no division by 2
else
f--;
}
System.out.println();
}

}

哪里可以保存一些资源?顺便说一句,我现在只能使用数组...抱歉德国评论。只是如果一些真正不必要的长循环或类似的东西引起了您的注意

谢谢!

最佳答案

而不是搜索到 n-1 ,我只会搜索到 (int) sqrt(n) 。自己弄清楚为什么这已经足够了。 ;-)

我不明白你为什么需要 altesP根本不。你不能只增加 p两个?

我不会通过删除来进行过滤。我会建立一个肯定列表,并添加您找到的质数。

研究快速素数测试,无需遍历整个筛子即可排除某个数字。

请对您的代码进行以下更改:

  1. 而不是删除 aZahlen ,构建 primes 的列表。 sqrtN = (int)sqrt(n)因为分配大小应该没问题,并使用计数 foundPrimes您知道多少个素数。

  2. 迭代p高达 <= sqrtN没有任何绒毛。看看是否有任何已知的素数是约数,否则你找到了一个新的素数。输出它,并将其存储在您的foundPrimes中列表。

关于java - Java 中更快的埃拉托斯特尼筛法和素数分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13659659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com