Мой код дает неправильный ответ на вопрос PRIME1 о спойе;как мне это исправить? - PullRequest
0 голосов
/ 02 апреля 2019

Я прилично новичок в Java и абсолютный новичок в конкурентном кодировании. Мне сказали попробовать решить проблемы в spoj, чтобы почувствовать это, и PRIME1 был первым, который я решил попробовать. Узнав о сито из эратосфена, и попытавшись составить рабочую программу, я получил ожидаемые результаты по затмению и сказал, что он тоже это принял, но спой сказал, что дает неправильный ответ

Постановка задачи: https://www.spoj.com/problems/PRIME1/

Поскольку я был новичком, я прошел через множество различных ошибок и исправил их в соответствии с рекомендациями различных форумов, с которыми мне приходилось сталкиваться, начиная с разделения на readLine и заканчивая попытками его отловить. Я не полностью понимаю все эти решения и не знаю, являются ли они причиной неправильного ответа. Я пытался запустить его несколько раз на затмении и проверять результаты из списка простых чисел, и даже idone он запустил мой код и сказал, что он был успешным, хотя я не знаю, насколько это правильно, из-за того, что я использовал веб-сайт для впервые благодаря спой.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


class Eratosthenes {
    public static void main(String[] args)throws IOException{

        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int n=Integer.parseInt(br.readLine());

            while(n-->0) {
                String[] inputs = br.readLine().split(" ");

                                //finding the limits

                int o=Integer.parseInt(inputs[0]);
                int p=Integer.parseInt(inputs[1]);


                int b=(int)Math.sqrt(p);

                int[] prime=new int[p+1];

                                //assigning all values prime at first


                for(int i=0;i<=p;i++) {
                    prime [i]=1;
                }

                                //removing 0 and 1
                prime[0]=0;
                prime[1]=0;

                                //using the sieve to remove all composite multiples of primes

                for(int i=2;i<=b;i++) {
                    if(prime[i]==1) {
                        for(int j=i*2;j<=p;j+=i) {
                            prime[j]=0;
                        }
                    }
                }


                                //printing the primes
                for(int i=0;i<prime.length;i++) {
                    if(prime[i]==1) {
                        if(i>=o)
                        System.out.println(i);
                    }
                }
            }
        }catch(Throwable trh) { return; }


    }
}

Что здесь не так? Это на самом деле дает неправильные результаты? Или это что-то еще?

1 Ответ

0 голосов
/ 02 апреля 2019

В конкурентном программировании результат должен быть точным. Для примера теста рассмотрим разницу между вашим выводом:

2
3
5
7
3
5

и ожидаемый результат:

2
3
5
7

3
5
...