سؤال

وأريد أن طباعة جميع الأعداد الأولية بين رقمين. هذا هو قانون بلدي:

package sphere;

import java.math.BigInteger;
import java.io.*;

class PrimeTest2 {
    public static void main(String args[]) throws java.lang.Exception {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String s = r.readLine();
        String [] splitted = s.split(" ");
        BigInteger lower = new BigInteger(splitted[0]);
        BigInteger upper = new BigInteger(splitted[1]);
        int lowerAsInt = Integer.parseInt(splitted[0]);
        int upperAsInt = Integer.parseInt(splitted[1]);
        BigInteger intermediate = lower;

        for (int i=lowerAsInt; i<upperAsInt; i++) {    
            intermediate = intermediate.nextProbablePrime();
            System.out.println(intermediate);
        }
    }
}

عند يتم تشغيله مع 1 10 الإخراج:

2
3
5
7
11
13
17
19
23

لماذا لا تتوقف عند 7؟

هل كانت مفيدة؟

المحلول

ولأن البرنامج يقول مرات تشغيل (1-9) لم تتوقف أقل من 10. بدلا من حلقة الخاص بك ربما تريد:

BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
  System.out.println(intermediate);
  intermediate = intermediate.nextProbablePrime();
}

وانظر الفرق؟ وتفضلوا بقبول فائق يبدأ في 1 ويتوقف عند 9 (أقل من 10)، وطباعة رقم على كل التكرار. توقف أعلاه عندما يكون العدد أكبر من الحد الأعلى.

نصائح أخرى

لديك الذي حددته لتشغيل حيث (ط <10)، وليس لوقف عندما تكون القيمة من رئيس الوزراء أكبر من 10

وأنت تزايد ط من جانب واحد في كل مرة، لذلك سيكون لتشغيلها من ط = 1 حتى ط = 10 (9 مرات). إذا كنت تريد أن توقف مجموعة في وقت سابق ط = المتوسط.

وأنت عد i من lowerASInt إلى upperAsInt. كنت عد ط 1-10. زيادات بيان i++ i مع 1 (واحد).

وهكذا يقرأ حلقة الخاص بك: في حين i أقل من 10، طباعة i رئيس الوزراء وزيادة مع 1.

وهكذا سوف تحصل على أول 9 النتائج.

وهذا يعمل إذا كنت تستخدم JDK8

 BigInteger lower=BigInteger.valueOf(1);
        BigInteger high=BigInteger.valueOf(100);
        Stream.iterate(lower, BigInteger::nextProbablePrime).limit(high.longValueExact())
                .filter(p -> p.compareTo(high) <= 0).forEach(System.out::println);

يرجى عدم استخدام بالتوازي () لتيار أعلاه، لأنها سوف تبطئ الأداء. وكقاعدة عامة من الإبهام من فضلك لا تتم بشكل مواز تيار إذا كان لديك Stream.iterate () أو Stream.limit () في التعليمات البرمجية. A معيارا بسيطا في بلدي VM يظهر نص مواز هو 4 مرات أبطأ من واحد متكرر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top