Dla danych 10001 twój program wypisze “brak” a przecież to nie prawda. Powinien wyświetlić coś w rodzaju: “dane wejściowe niezgodne z założeniem”.
Takie ograniczenia podane są przez autorów tylko po to, aby rozwiązujące osoby mogły dobrać odpowiedni typ zmiennych czy ewentualnie [w innych zadaniach] wielkości tablic statycznych.
Tutaj wartość 10000 sugeruje, że można użyć trypu short int. Ale przecież wykonujemy mnożenia, więc 10000 * 10000 = 10 0000 000, a dla takich wartości short to za mało, ale wystarczy w zupełności typ int. W zadaniach łatwych można w ciemno na 90% [99%] przyjąć, że typ int jest wystarczający i wskazany. Jeżeli w tym zadaniu użyjemy c’ = sqrt ( a² + b²) lub c" = hypot(a, b), to wtedy i tylko wtedy musimy użyć typów zmiennoprzecinkowych (double).
Zamiast wielokrotnego liczenia:
a*a, b*b, c*c,
można zrobić to [pomnożyć] raz i potem używać:
aa = a*a, bb = b*b, cc = c*c
ale jeszcze lepiej[?], na początek znaleźć najdłuższy odcinek i wtedy nie potrzeba pisać tak skomplikowanych [rozbudowanych] warunków. Po stwierdzeniu [sprawdzeniu], że można zbudować trójkąt, wystarczy już tylko:
diff = c² - (a² + b²), a następnie:
if diff == 0 to trójkąt taki
if diff < 0 to trójkąt siaki
else trójkąt inny
PS
Podejrzewam, że moje pierwsze rozwiązania tego zadania, też nie były takie ładne i proste, ale wolę tego teraz jeszcze nie sprawdzać.
To teraz takie zadanie: http://pl.spoj.com/problems/TTRI/23
Tu wystarczy “tylko” odpowiedzieć, czy da się zbudować trójkąt czy nie.
Dyskutowano już o tym zadaniu tu -> : 1361. Trzy liczby [TTRI]
#include
#include
#include
using namespace std;
int main()
{
vector tab(3);
while(cin>>tab[0]>>tab[1]>>tab[2])
{
sort(tab.begin(),tab.end());
if((tab[0]+tab[1])<tab[2]) cout<<“brak”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])>(tab[2]*tab[2])) cout<<“ostrokatny”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])==(tab[2]*tab[2])) cout<<“prostokatny”<<endl;
else if((tab[0]*tab[0]+tab[1]*tab[1])<(tab[2]*tab[2])) cout<<“rozwartokatny”<<endl;
}
return 0;
}
Chciałbym się dowiedzieć gdzie jest błąd i czy dopuszczalna jest funkcja sort()?
Jedną z prób, które robiłem było takie wczytywanie, jednak też nie zadziałało, być może wtedy był jakiś błąd. Nie zauważyłem że usunąłem przypadkowo wczytywanie. Czy na pewno wczytywanie while(cin>>a>>b>>c) jest dobre, bo mogę wprowadzić tylko jeden raz boki jednego trójkąta, przy kodzie tu był link
Tytułem podpowiedzi, masz w kodzie instrukcję, która jest w niewłaściwym miejscu. Jeśli ją przesuniesz we właściwe miejsce to kod zadziała. Druga podpowiedź jest taka, że ta instrukcja jest w ogóle niepotrzebna.
Tak w ogóle to po co wykonujesz 3 razy taki sam blok? Uszereguj sobie zmienne w kolejności rosnącej np. tak a,b,c (jeśli wczytane zmienne będę miały inny porządek to je po prostu przedefiniuj). Wtedy wystarczy jeden blok
Można to znacznie uprościć, @korkirw - udało Ci się doczytać kod do końca?
while (cin >> a >> b >> c) { // <--- wystarczyło przejrzeć ten wątek od początku!
Nazwy zmiennych - w innym miejscu pisałem o nieużywaniu skrótów, ale dotyczy to tylko niezrozumiałych poza tworzącym kod skróconych nazw. W tym zadaniu chodzi o boki trójkąta, więc wystarczyłoby np samo największy bez _bok. Zdrugiej strony, dla każdego zajmującego sę geometrią, powinno być natychmiast, bez dodatkowych objaśnień, zrozumiałe równanie: a² + b² = c² [tw. Pitagorasa]. Podobnie dla fizyka E = mc², czy punkt[0].x, pkt[2].y itd, więc w takich wypadkach można sobie darować opisowe nazwy, czy nadmiar wyjaśniających komentarzy.
Musimy zagwarantować, aby c było faktycznie największe, a boki a i b, dowolnie inne [nie musimy szukać średniego ani najmniejszego.
Można to zrobić np tak:
if a > b : swap a b
if b > c : swap b c
...
if a + b <= c to ...
ELSE
wynik = c² - a² + b²
if wynik == .. to
else if wynik < od to ...
else trójkątypozostałe.
PS
W tym zadaniu można użyć zmiennych całkowitych - dane przykładowe nie są ujemne.
@narbej przyznaję, że nie analizowałem całego kodu . Zatrzymałem się gdy zobaczyłem warunek a+b >= c