Błąd odpowiedzi w wyznaczaniu najbliższej liczby pierwszej

0

Witam
Link do zadania: http://www.spoj.com/FRAKTAL/problems/FR_04_14/
Był już temat podobny nie tak dawno, ale nie znalazłem tam odpowiedzi. Mimo tego, że pokazuje mi poprawne odpowiedzi w przypadkach, które wypisuje sam w konsoli to spoj jednak nie przepuszcza mi zadania i nie wiem w jakim miejscu mam błąd. Druga rzecz to, czy dobrze napisałem sito?

 
#include <iostream>

using namespace std;

bool p[10000001] = {};

int main()
{
    for (int i = 2;i*i<=10000000;i++)
    {
        if(!p[i])
        {
            for(int j=i*i;j<=10000000;j+=i)
            {
                p[j]=true;
            }
        }
    }
    p[1]=1;
    p[0]=1;
    int t,a,d=1,u=1;
    cin >> t;
    for (int i = 0;i<t;i++)
    {
        cin >> a;
        if(p[a]==0)
        {
            cout << a << endl;
        }
        else
        {
            while(p[a+d]==1)
            {
                d++;
            }
            while(p[a-u]==1)
            {
                u++;
            }
            if(u>d)
            {
                cout << a+d << endl;
            }
            else
            {
                cout << a-u << endl;
            }
            u=1;
            d=1;
        }
    }
}

1

Dla n = 10^7 twój program zwraca 10^7 + 1 co liczbą pierwszą nie jest. Dzieje się tak dlatego, że nie masz w rozmiarze tablicy uwzględnionego miejsca na liczbę pierwszą większą od 10^7.

Wypisuję 10^7 + 1 dlatego, że założyłeś, że obie pętle while znajdą liczbę pierwszą odpowiednio większą od n i mniejszą od n. Z tym, że przy rozmiarze tablicy 10^7 nie masz miejsca na szukanie liczby pierwszej powyżej. W efekcie warunek u > d jest spełniony i wypisujesz a + d zakładając, że znalazłeś liczbę pierwszą wówczas gdy znalazłeś nieistniejący element tablicy (który o dziwo ma wartość 0, dla tablicy bool p[10000001] wartość p[10010000] wynosi 0).

Jeżeli zmodyfikujesz kod jak poniżej, dla n = 10^7 zwraca 9 999 991 co jest chyba poprawną odpowiedzią. Innych błędów się nie doszukałem

#include <iostream>

using namespace std;

const int N = 1e7 + 1e2;
bool p[N] = {};

int main()
{
	for (int i = 2; i*i <= N; i++)
	{
		if (!p[i])
		{
			for (int j = i*i; j <= N; j += i)
			{
				p[j] = true;
			}
		}
	}
	p[1] = 1;
	p[0] = 1;
	int t, a, d = 1, u = 1;
	cin >> t;
	for (int i = 0; i<t; i++)
	{
		cin >> a;
		if (p[a] == 0)
		{
			cout << a << endl;
		}
		else
		{
			while (p[a + d] == 1)
			{
				d++;
			}
			while (p[a - u] == 1)
			{
				u++;
			}
			if (u>d)
			{
				cout << a + d << endl;
			}
			else
			{
				cout << a - u << endl;
			}
			u = 1;
			d = 1;
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1