Też mam problem z tym zadaniem. U mnie wszystko działa idealnie, a ciągle dostaję informację, że błędny wynik ;/
Poniżej kod programu c++:
//kod zjadl troll :P (AC)
Edit: już działa, zapomniałem uwzględnić w funkcji mniejsze(), że strlen(a) może być mniejsze niż strlen(b) eh, przez takie głupoty człowiek najwięcej czasu traci podczas kodzenia
Na początek witam wszystkich.
Zacząłem sobie rozwiązywać tydzień temu zadania u Was no i na razie trochę rozwiązałem, ale powoli zaczyna mnie denerwować cały ten automat testujący Problem ma z zadaniem KC015 i nie mam pojęcia dlaczego mi nie przyjmuje sprawdzarka tego.
Chciałem sobie ogarnąć trochę wyższa matematykę, interpolacje te sprawy z zadań trudnych, ale kurcze postanowiłem robić po kolei.
Napisałem najpierw w C, to mówi, ze źle, to napisałem w Perlu to tez nie pasuje.
Poniżej zamieszczam oba kody może ktoś by mnie nakierował, bo nie wydaje mi się żebym nie umiał tego zadania zrobić.
[bbone=perl,3137]#!/usr/bin/perl
while($line = ) {
@dane = split(/\s+/, $line);
$l1 = @dane[0];
$l2 = @dane[2];
$znak = @dane[1];
if($znak eq "==") {
if($l1 == $l2) {
print "1\n";
} else {
print "0\n";
}
} elsif($znak eq "!=") {
if($l1 != $l2) {
print "1\n";
} else {
print "0\n";
}
} elsif($znak eq "<=") {
if($l1 <= $l2) {
print "1\n";
} else {
print "0\n";
}
} elsif($znak eq ">=") {
if($l1 >= $l2) {
print "1\n";
} else {
print "0\n";
}
}
}
[/bbone]
Perl ma to do siebie, ze jak dostaje liczbę to jeśli jest ogromna to wyświetlą w notacji wykładniczej, wiec z porównywaniem nie powinno być problemu, chyba ze nie rozbija split na liczby tylko na stringi.
Teraz kod w C:
[bbone=c,3138]
include
include
int i;
int nierowne(char *l1, char *l2) {
for(i = 0; l1[i]; i++)
if(l1[i] != l2[i])
return 1;
return 0;
}
int rowne(char *l1, char *l2) {
for(i = 0; l1[i]; i++)
if(l1[i] != l2[i])
return 0;
return 1;
}
int mniejsze(char *l1, char *l2) {
for(i = 0; l1[i]; i++) {
if(l1[i] < l2[i])
return 1;
else if(l1[i] > l2[i])
return 0;
}
return 1;
}
int wieksze(char *l1, char *l2) {
for(i = 0; l1[i]; i++) {
if(l1[i] > l2[i])
return 1;
else if(l1[i] < l2[i])
return 0;
}
return 1;
}
int main(void)
{
char l1[1024] = {0}, l2[1024] = {0}, z1, z2;
while(fscanf(stdin, "%s %c%c %s", l1, &z1, &z2, l2) != EOF) {
if(z1 == '!')
printf("%d\n", nierowne(l1, l2));
else if(z1 == '=')
printf("%d\n", rowne(l1, l2));
else if(z1 == '<')
printf("%d\n", mniejsze(l1, l2));
else if(z1 == '>')
printf("%d\n", wieksze(l1, l2));
memset(l1, 0, 1024 * sizeof(char));
memset(l2, 0, 1024 * sizeof(char));
}
return 0;
}
[/bbone]
Będę wdzięczny jakby ktoś na to zerknął.
pl.spoj.pl/problems/KC015/71 <- klik!
[bbone=CPP,398]AC[/bbone]
Sprawdziłem testy z forum - wszystkie działają. Pomysł co przegapiłem / sknociłem?
Żeby nie tworzyć nowego tematu wstawiam tutaj swój kod.
Może ktoś zerknie. Ogólnie nie jest ładnie zrobiony, ale skupiłem się kodzie. Na początku sprawdziłem możliwości ze znakami i liczbami i wyglądało dobrze. Niestety WA. Doczytałem, że występują zera wiodące to zaimplementowałem odpowiedni kod. Przetestowałem i było w porządku, jednak znowu to samo. Może popełniam jakiś błąd albo muszę zmienić podejście. Dzięki za jakąkolwiek pomoc
Jesteś niestarannym coderem albo sknerusem. Jeżeli wczytujesz string 2 elementowy, to jakiej wielkości tablicę potrzebujesz? Analogicznie string 1000 elementowy, a szczególnie gdy potem używasz strlen - wiesz jak działa ta funkcja?
Np jakoś tak [moja interpletacja, prostsza - do zrozumienia]:
int strlen (char *a){
int i = 0;
while (*a++ != '\0') i++;
return i;
}
PS
Moim zdaniem i według mojego testu, nie ma w tym zadaniu żadnych zer wiodących, a czy są/były błędne testy nie wiem. Dlatego oba komentarze usuwam z pod zadania a przenoszę tutaj i jeszcze raz zwracam uwagę, że oba komentarze mogą być bardzo błędne, nie przemyślane, błednie przetestowane.
2015-01-19 20:40:43 Karol Ka¼mierczak
Czy dane wejściowe zawierają zera wiodące?
Edit: zawierają.
Proste porównywanie łańcuchów nie wystarczy.
Ostatnio edytowany: 2015-02-13 20:52:09 2013-06-19 11:34:16 PaweÅ‚ Ciosek W testach sprawdzających jest błąd, np. dla 1234 >= 1235, mój
program wypisywał złą odpowiedz, mimo tego dostałem AC. Proponuje
zaktualizować testy. Pozdrawiam.
Witam. Jestem początkujący i stworzyłem kod, który u mnie działa bez zarzutów, ale sędzia odrzuca z podpisem "Przekroczono limit czasu". Mógłby ktoś rzucić okiem?
include iostream
using namespace std;
int main()
{
for(;; )
{
string k1,k2,x;
cin>>k1>>x>>k2;
if (x=="==")
{
if (k1==k2) cout<<"1"<<endl;
else cout<<"0"<<endl;
};
if (x==">=")
{
if (k1>=k2) cout<<"1"<<endl;
else cout<<"0"<<endl;
};
if (x=="<=")
{
if (k1<=k2) cout<<"1"<<endl;
else cout<<"0"<<endl;
};
if (x=="!=")
{
if (k1!=k2) cout<<"1"<<endl;
else cout<<"0"<<endl;
};
}
return 0;
}
Z góry dzięki za pomoc
Masz racje. Dla stringów nie da mi właściwej odpowiedzi, ale po zmianie na long double
long double k1, k2;
string x;
program już działa bez problemu, aczkolwiek sędzia dalej wyświetla, że przekroczono limit. Myślę, że problem leży właśnie w tym, że program nie wie, kiedy skończyć. Dzięki za sprawdzenie