SPOJ - Szyfrowanie2 (JSZYFR2)

0

Mam problem z pewnym zadanie ze SPOJ'a:
https://pl.spoj.pl/problems/JSZYFR2/

Dla wszystkich testów co sprawdzałem jest ok, ale SPOJ wypisuje błędną odpowiedź.

Oto kod:


#include <cstdio>

bool kod(int n, int k);

int t[25];

//----------------------------------------------------------------------

int main()
{	
	int D, n;
	
	scanf("%d", &D);
	
	while(D--)
	{
		scanf("%d", &n);
		
		for(int i = 0; i < n; i++)
		{
			scanf("%d", &t[i]);
		}
		
		if(kod(n, 127))
		{
			printf("127 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 127));
			}
			printf("\n");
			continue;
		}
		
		if(kod(n, 131))
		{
			printf("131 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 131));
			}
			printf("\n");
			continue;
		}
		
		if(kod(n, 137))
		{
			printf("137 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 137));
			}
			printf("\n");
			continue;
		}
		
		if(kod(n, 139))
		{
			printf("139 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 139));
			}
			continue;
		}
		
		if(kod(n, 149))
		{
			printf("149 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 149));
			}
			printf("\n");
			continue;
		}
		
		printf("NIECZYTELNE\n");
		
	}
	
	return 0;
}

//----------------------------------------------------------------------

bool kod(int n, int k)
{
	for(int i = 0; i < n; i++)
	{
		if(t[i] % k < (int) 'A' || t[i] % k > (int) 'Z')
			return false;
	}
	return true;
}

Nie działa także, jeśli biorę pod uwagę możliwość kilku liczb pierwszych, które deszyfrują dane wejściowe:


#include <cstdio>

bool kod(int n, int k);

int t[25];

//----------------------------------------------------------------------

int main()
{	
	int D, n;
	
	scanf("%d", &D);
	
	while(D--)
	{
		scanf("%d", &n);
		
		for(int i = 0; i < n; i++)
		{
			scanf("%d", &t[i]);
		}
		
		int lp = 0;
		
		if(kod(n, 127))
		{
			printf("127 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 127));
			}
			printf("\n");
			lp++;
		}
		
		if(kod(n, 131))
		{
			printf("131 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 131));
			}
			printf("\n");
			lp++;
		}
		
		if(kod(n, 137))
		{
			printf("137 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 137));
			}
			printf("\n");
			lp++;
		}
		
		if(kod(n, 139))
		{
			printf("139 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 139));
			}
			printf("\n");
			lp++;
		}
		
		if(kod(n, 149))
		{
			printf("149 ");
			for(int i = 0; i < n; i++)
			{
				printf("%c", (char) (t[i] % 149));
			}
			printf("\n");
			lp++;
		}
		
		if(lp == 0)
			printf("NIECZYTELNE\n");
		
	}
	
	return 0;
}

//----------------------------------------------------------------------

bool kod(int n, int k)
{
	for(int i = 0; i < n; i++)
	{
		if(t[i] % k < (int) 'A' || t[i] % k > (int) 'Z')
			return false;
	}
	return true;
}

Z góry dzięki

0

Akurat to rozklepalem zadanie, ale rozwiazania Ci nie dam.

Masz 5 tych liczb pierwszych jak zauwazyles juz, wiec lecisz w dwoch for'ach 5 razy dlugosc ciagu i jesli przypasuje dla wszystkich liczb to wychodzisz z petli i wypisujesz to co znalazles, oczywiscie zamienione odpowiednio.

Tam pamietam, ze jest haczyk, poniewaz moga byc nawet 2 rozwiazania dla jednego ciagu, ale sam musisz ocenic, ktore jest dobre ;p W takim przypadku sam sprawdz co musisz wypisac, na pewno nie wszystkie rozwiazania.

0

Dzięki, zaakceptowało. Słowa: "Jeżeli odczytanie kodu jest nie możliwe...", zrozumiałem jako: jeżeli kod nie ma żadnego rozwiązania, a powinno być: jeżeli kod nie ma żadnego rozwiązania lub ma więcej niż jedno :-)

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