gpt4 book ai didi

java - 学习 Java 调试

转载 作者:行者123 更新时间:2023-12-01 16:11:26 25 4
gpt4 key购买 nike

我正在学习在 Netbeans 上使用 JPDA 并解决 Prime Generator Sphere 在线法官的问题。

我一直在阅读this tutorial on netbeans.org关于他的 JPDA,但没有发现它有多大帮助。

此代码基于 starblue here 提供的 Sieve of Eratostenes 实现,运行如下:

2
1 10
//here the primes between 1 and 10 should print
3 5
//here the primes between 3 and 5 should print




package sphere;

/**
*
* @author Administrator
*/
//import java.util.ArrayList;
import java.util.BitSet;
import java.lang.Math.*;
import java.util.ArrayList;

public class Main
{

public static int ApproximateNthPrime(int nn)
{
double n = (double)nn;
double p;
if (nn >= 7022)
{
p = n * Math.log(n) + n * (Math.log(Math.log(n)) - 0.9385);
}
else if (nn >= 6)
{
p = n * Math.log(n) + n * Math.log(Math.log(n));
}
else if (nn > 0)
{
p = new int[] { 2, 3, 5, 7, 11 }[nn - 1];
}
else
{
p = 0;
}
return (int)p;
}

// Find all primes up to and including the limit
public static BitSet SieveOfEratosthenes(int limit)
{
final BitSet primes = new BitSet();
primes.set(0,false);
primes.set(1,false);
primes.set(2,limit,true);

for (int i =0; i*i<limit;i++)
{
if (primes.get(i))
{
for (int j=i*1; j<limit;j+=1)
{
primes.clear(j);// hace que el indice j sea false (no primo)
}

}

}
return primes;
}

public static ArrayList<Integer> GeneratePrimesSieveOfEratosthenes(int n)
{
int limit = ApproximateNthPrime(n);
BitSet bits = SieveOfEratosthenes(limit);
ArrayList <Integer> primes = new ArrayList<Integer>();
for (int i = 0, found = 0; i < limit && found < n; i++)
{
if (bits.get(i))
{
primes.add(i);
found++;
}
}
return primes;
}





public static void main (String[] args) throws java.lang.Exception
{
java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in));
String s;

s= r.readLine();

int test_cases = Integer.parseInt(s);


int case_counter =0;

while (case_counter<test_cases) {

// System.out.println(s);
s = r.readLine();

String [] splitted = s.split(" ");

int lower_bound = Integer.parseInt(splitted[0]);
int upper_bound = Integer.parseInt(splitted[1]);



ArrayList <Integer> primesList= GeneratePrimesSieveOfEratosthenes(upper_bound);



for (int i =0; i<primesList.size();i++){
if (primesList.get(i)<=lower_bound)System.out.println(primesList.get(i));
}


case_counter++;

System.out.println(" "); // space that separates test cases

}
}
}

我知道 ArrayList primesList 没有被初始化,我对这段代码表示怀疑,因为老实说,我不太明白它:

if (primes.get(i))
{
for (int j=i*1; j<limit;j+=1)
{
primes.clear(j);
}

}

我想到在这里使用条件断点,条件是:

primes.get(j)==false

但我不确定我是否能够通过这种方式获得有意义的信息。这些是我得到的屏幕:

alt text http://img525.imageshack.us/img525/6238/breakpoints.jpg

alt text http://img98.imageshack.us/img98/5262/watchesz.jpg

我不知道如何从中获取有用的信息。

我的问题是:

a)我想观看素数 BitSet 经历这个循环的过程。

我该怎么做?

b) 这段代码究竟有什么问题?你是如何使用调试器发现它的?

请提及分步过程。

最佳答案

所以,我提取出了以下方法:

    private static void printPrimes(int lower_bound, int upper_bound) {
ArrayList<Integer> primesList = GeneratePrimesSieveOfEratosthenes(upper_bound);

for (int i = 0; i < primesList.size(); i++) {
if (primesList.get(i) <= lower_bound)
System.out.println(primesList.get(i));
}
}

并更改了 main() 方法,仅使用几个任意参数(10 和 100)调用该方法,因为我不想在控制台和调试器上搞乱同时。然后(我使用的是 Eclipse)在 ApproximateNthPrime()、SieveOfEratosthenes() 和 GeneratePrimesSieveOfEratosthenes() 的开头和结尾处放置普通断点> 确保他们被调用。 (顺便说一句,与 C# 不同,Java 约定方法名称以小写字母开头。)

所有这一切都不需要费心去理解代码。 :) 然而,在第一次运行之后,很明显问题是由 SieveOfEratosthenes() 生成的 BitSet 始终为空(或者更确切地说,始终完全为空) )。我没有使用过 NetBeans 调试器,但我怀疑“本地变量”选项卡是您的 friend 。

我不会为你做作业。 :) 但是埃拉托斯特尼筛法的思想是跳过素数,只消除非素数。检查您的 SieveOfEratosthenes() 方法并问问自己:它什么时候会跳过一个数字?

关于java - 学习 Java 调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1077404/

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