我的输入是Integer
。在该值之前,应找到所有素数并以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();
}
}
我可以在哪里节省一些资源?顺便说一下,我现在只能使用数组...对不起德国评论。只是如果一些真正不必要的长循环或类似东西吸引你的眼球
谢谢!
答案 0 :(得分:1)
我最多只搜索n-1
,而不是最近搜索(int) sqrt(n)
。
找出为什么这个就足够了。 ; - )
我不明白为什么你需要altesP
。你不能只将p
增加两倍吗?
我不会通过罢工来过滤。我会建立一个肯定的列表,并添加你找到的素数。
研究可以排除数字而不必通过整个筛子的快速初始测试。
请对您的代码进行以下更改:
而不是删除aZahlen
,构建primes
列表。 sqrtN = (int)sqrt(n)
因为分配大小应该没问题,并使用计数foundPrimes
来表示您知道的素数。
在没有任何模糊的情况下,将p
迭代到<= sqrtN
。看看是否有任何已知的素数是除数,否则你会找到一个新的素数。输出它,并将其存储在foundPrimes
列表中。
答案 1 :(得分:-1)
int[]
每个值使用32位。如果使用byte[]
,则每个值将使用8位,如果使用BitSet,则每个值使用1位(小32倍)
答案 2 :(得分:-1)
我不确定你想做什么。我认为你试图通过试算除以素数来计算整数。为此,你不需要所有小于整数的素数,只需要小于整数平方根的素数,所以你只需要一个简单的Eratosthenes筛子来选择素数:
function sieve(n)
bits := makeArray(2..n, True)
ps := []
for p from 2 to n
if bits[p]
ps.append(p)
for i from p+p to n step p
bits[i] = False
return ps
然后您可以使用这些素数来执行分解:
function factors(n)
ps := primes(sqrt(n))
fs := []
p := head(ps)
while p*p <= n
if n%p == 0
fs.append(p)
n := n / p
else
ps := tail(ps)
p := head(ps)
fs.append(n)
return fs
我在我的博客中讨论了essay中素数的编程,其中包括Java中这两种算法的实现。本文还包括其他更有效的枚举素数和分解上面给出的整数的方法。