تعلم أن التصحيح في جافا
سؤال
أنا على حد سواء تعلم استخدام JPDA على Netbeans و حل رئيس الوزراء مولد مشكلة المجال على الانترنت القاضي.
لقد تم قراءة هذا البرنامج التعليمي على netbeans.org عن أنه JPDA ، ولكن لم أجد من يساعد كثيرا.
هذا الرمز الذي يستند إلى غربال من Eratostenes التنفيذ المقدمة من starblue هنا, هو يعمل مثل هذا:
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
ولكن لست متأكدا إذا أنا قادرة على الحصول على معلومات ذات مغزى هذا الطريق.هذه هي شاشات أنا الحصول على:
النص البديل http://img525.imageshack.us/img525/6238/breakpoints.jpg
النص البديل http://img98.imageshack.us/img98/5262/watchesz.jpg
أنا لا أعرف كيفية الحصول على معلومات مفيدة من هذا.
أسئلتي هي:
أ)أريد مشاهدة يعبي BitSet كما تذهب من خلال هذه الحلقة.
كيف أفعل ذلك ؟
ب) ما هو بالضبط الخطأ في هذا الكود ؟ كيف بقعة باستخدام المصحح?
يرجى ذكر خطوة بخطوة عملية.
المحلول
لذا المستخرج الطريقة التالية:
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) لأنني لا تريد أن تعبث مع وحدة المصحح في نفس الوقت.ثم (أنا باستخدام الكسوف) وضع العادية نقاط في بداية و نهاية خطوط ApproximateNthPrime()
, SieveOfEratosthenes()
و GeneratePrimesSieveOfEratosthenes()
للتأكد من أنها كانت مدعوة.(بالمناسبة, جافا الاتفاقية ، على عكس C#, هو الأسلوب أسماء أن تبدأ مع أقل حدة الرسالة.)
كل ذلك كان دون عناء لفهم التعليمات البرمجية.:) ومع ذلك ، بعد أول تشغيل ، كان من الواضح أن المشكلة هي أن BitSet
التي تنتجها SieveOfEratosthenes()
دائما فارغة (أو بالأحرى دائما تماما false
).أنا لم تستخدم NetBeans المصحح ، ولكن أظن أن "المتغيرات المحلية" علامة التبويب هو صديقك هنا.
أنا لن تفعل المنزلية الخاصة بك بالنسبة لك.:) لكن فكرة غربال إراتوستينس هو تخطي الأعداد و القضاء فقط من غير يعبي.فحص الخاص بك SieveOfEratosthenes()
طريقة واسأل نفسك:متى سيتم تخطي الرقم ؟