2017-02-13 3 views
3

Мне нужно написать программу, которая находит простые числа между двумя введенными пользователем номерами. Единственная проблема, с которой я столкнулся, состоит в том, что на выходе есть одна дополнительная запятая, чем нужно. Как я могу это исправить?Разделительный вывод целых чисел с запятыми в java

import java.util.Scanner; 

public class Primes { 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int start = sc.nextInt(); 
    int end = sc.nextInt(); 
    for (int i =start; i <= end; i++) { 
     if (isPrime(i)) { 
      System.out.printf("%d,", i); 
     } 
    } 
} 

public static boolean isPrime(int n) { 
    if (n <= 1) { 
     return false; 
    } 
    for (int i =2; i < Math.sqrt(n); i++) { 
     if (n % i == 0) { 
      return false; 
     } 
    } 
    return true; 
    } 
} 

Вход: 1 10

Выход: 2,3,4,5,7,9,

+1

ли вы знать заранее, который является последним премьер в диапазоне? –

+2

Вы не можете напечатать запятую после целого числа, потому что в этот момент вы не знаете, будет ли другое целое число. Вместо этого напечатайте запятую _before_ целое число и не делайте это в первый раз. Возможно, вам понадобится 'boolean', чтобы отслеживать, является ли это в первый раз. – ajb

+1

Мой комментарий был к удаленному комментарию от shmosel, а не вам. –

ответ

4

пытаются использовать StringJoiner более apropriate в этом случае:

import java.util.Scanner; 

public class Primes { 

public static void main(String[] args) { 

    StringJoiner joiner = new StringJoiner(","); 

    Scanner sc = new Scanner(System.in); 
    int start = sc.nextInt(); 
    int end = sc.nextInt(); 

    for (int i =start; i <= end; i++) { 

     if (isPrime(i)) { 
      joiner.add(Integer.toString(i)); 
     } 

    } 

    System.out.println(joiner.toString()); 
} 

без StringJoiner:

public class Primes { 

public static void main(String[] args) { 

    String separator = ""; 

    Scanner sc = new Scanner(System.in); 
    int start = sc.nextInt(); 
    int end = sc.nextInt(); 

    for (int i =start; i <= end; i++) { 

     if (isPrime(i)) { 
      System.out.printf(separator + "%d", i); 

      separator = ","; 
     } 

    } 
} 
+0

Ницца. Я не знал о StringJoiner. Очень полезно. –

+0

Да, это было введено с java 8. –

+0

это работает, но как бы я это сделал без StringJoiner? Я нахожусь в классе Java для начинающих, и мы еще этого не узнали. – lukas109

1

Вот немного другой подход, с использованием потоков:

String output = IntStream.rangeClosed(start, end) 
     .filter(Primes::isPrime) 
     .mapToObj(String::valueOf) 
     .collect(Collectors.joining(",")); 

System.out.println(output); 
Смежные вопросы