WA na zadatku rastojanje tacaka iz zbirke

#include <bits/stdc++.h>

using namespace std;

int ax,ay,bx,by;
float p;

int main()
{
    scanf("%i", &ax);
    scanf("%i", &ay);
    scanf("%i", &bx);
    scanf("%i", &by);
    p=sqrt(pow((ax-bx),2) + pow((ay-by),2));
    printf("%.5f", p);
    return 0;
}

Imam problem sa kodom daje WA na c++14, a meni u code blocks daje dobro resenje za dati primer, da li ima neko ideju gde gresim ? Zadatak je :https://petlja.org/BubbleBee/r/problemi/Zbirka/rastojanje_tacaka#

Takodje posto sam pre 2 dana presao na scanf i printf jer sam cuo da su brzi od cin i cout koje sam koristio do sada, zanima me da li je neophodno da i dalje imam using namespace std; na vrhu, meni je logicno da ne ali ipak da pitam…

Ja licno koristim cin i cout. To jeste sporije, medjutim uz nekoliko linija koda postaje brze(ako te zanimaju mogu ti ih pokazati). Sto se tice zadatka moguca greska je eventualno pow funkcija koja uopste nije pouzdana, jer radi po sasvim drugom nacinu stepenovanja. Takodje do greske moze doci uz premalo decimala float tipa mada ne verujem.

P.S. Potreban ti je using namespace std.

2 Likes

Aj ako ti nije problem da mi pokazes, bio bih ti zahvalan. Ja sam to malo zagledao ove kodove od ovih sto su medju prvima i svi koriste scanf i printf, onda sam guglao malo i vidim da zaista jesu brzi pa sam i ja krenuo da ih koristim evo mogu ti reci da sam se vec navikao, ali opet ako mozes napisi mi taj kod.

Inace probao sam i sa ax-bx puta ax-bx umesto ovog pow i isti problem tako da stvarno nemam predstavu sta radim pogresno…

EDIT: #include <bits/stdc++.h>

float a,b;

int main()
{
    scanf("%f %f", &a,&b);
    printf("%.2f\n%.2f", (abs(b)*abs(-b/a))/2,abs(b)+abs(-b/a)+sqrt((-b/a)*(-b/a)+b*b));
    return 0;
}

Imam problema i sa ovim zadatkom https://petlja.org/BubbleBee/r/problemi/Zbirka/trougao_odredjen_pravom_i_koordinatnim_pocetkom mozda je problem do ove formule za rastojanje dve tacke ja se uvek okrecem na matematiku al mozda postoji neki drugi metod za izracunavanje rastojanja ? ( Kad testiram kod mene daje tacna resenja )

nam mom računaru pokazuje tačno rešenje, a grader mi izbacuje WA
evo koda u C-u

      #include <stdio.h>
      #include <math.h>
        int main() {
            int x,y;
            int a,b;
            scanf("%d %d %d %d", &x, &y, &a, &b);
            int dx = x-a;
            int dy = y-b;
            printf("%.5f", sqrt(dx*dx+dy*dy));
        }

Ista situacija i kod mene druze…

Koliko ja znam, namespace std ti je potreban samo kod funkcija iz c++ -ove biblioteke.
A sto se tice pow(), meni je radila ispravno u svim zadacima.
Ako si bas siguran da je do pow(), napravi svoju funkciju pa probaj (takodje, preporucio bih ti da ne koristis bits/stdc++.h zato sto includuje mnogo headera koji ti nisu potrebni)

Sa standardnog ulaza unose se četiri realna broja
unose se četiri realna broja
četiri realna broja
realna broja
realna

Salim se malo, ali ono, citajte zadatak.

#include <cmath>
#include <cstdio>

using namespace std;

int main() {

    float ax, ay, bx, by;
    scanf("%f%f%f%f", &ax, &ay, &bx, &by);

    printf("%.5f",sqrt((ax-bx) * (ax-bx) + (ay-by) * (ay-by)));

    return 0;
}
1 Like

gle stvarno :sweat_smile:
Ali onaj ko samo pogleda primer misli da su celi brojevi

U zadatku, kako si ti uradio, do poslednjeg reda racunas sa celim brojevima, a nigde taj rezultat ne pretvaras u realan broj (float). Na kraju, tvoje p dobija vrenost celobrojnog rezultata na koji se samo dodaju nule. Probaj da ili sve prebacis u float ili da stavis p=(float) pa nastavak

#include
#include
#include

using namespace std;

int main(){
float ax, bx, ay, by;
cin >> ax >> ay >> bx >> by;

double r;

r = sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));

printf("%.5f", r);

}

Hvala dobri ljudi. Slepac jednom slepac ceo zivot lepo meni kaze cale…

1 Like

Što se tiče par stvari spomenutih ovde, pow je standardna matematička funkcija koja uvek radi ono što se od nje očekuje (matematika ne poznaje ‘više načina’ za stepenovanje, makar ne koliko je meni poznato). A ako već postoji funkcija u standardnoj biblioteci koja radi ono što nam treba, mislim da je skroz opravdano pretpostaviti da je to najoptimizovanija varijanta moguća za data ograničenja (recimo, dobro optimizovan pow koji pokriva sve granične slučajeve izgleda ovako nekako). Ono što se može eventualno javiti kao problem je što je u cmath i math.h različito definisan pow, i kad ne znaš šta tačno include-uješ zapravo ne znaš ni šta se tačno poziva. C++14 je to donekle sredio, jedino mogu da se dese nesuglasice ako se na kompu kompajlira za drugi standard. Isto važi i za abs/fabs i varijacije.

Za takmičarsko programiranje se kaže da su cin i cout spori (znači, kada su ulazi ogromni) jer su sinhronizovani sa scanf/printf, i onda kako bi ti mogao da mešaš ova dva načina za ulaz oni moraju međusobno da se čekaju i proveravaju pa to usporava stvari kada se unosi brda podataka. Ja računam da niko pri zdravoj pameti nema razlog da meša dva načina za ulaz/izlaz u istom fajlu, tako da negde na početku slobodno možeš da dodaš std::ios_base::sync_with_stdio(false) i koristiš cin/cout, ako ti je to zgodnije. Samo izbegavaj endl nego koristi ‘\n’ kao i inače (endl štampa novi red i prazni bafer, što je za zadatke uvek suvišna operacija).

2 Likes

Hvala druze, ipak cu ja nastaviti sa scanf i printf nekako su mi bas prirasli srcu.

Nisam imao vremena ranije. Ubrzivaci za cin i cout:

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cerr.tie(nullptr);

A sto se tice pow funkcije, vrlo je lako da i ona sama napravi gresku, zato sto ona koristi logoritme za to izracunavanje, preporucujem da sam napravis tu funkciju, vrlo je lako. Ono sto je bitno jeste da gledas da rekurzivno napravis to ‘binarno stepenovanje’.

Evo ja sam napravio jednu template funkciju, da se ne cimate:
https://pastebin.com/EZ76WFyu
Treba zapamtiti da template za svaki korisceni tip funkcije pravi novu funkciju tog tipa (koliko sam ja upoznat)

Evo moje brze verzije funkcije. Ovo je samo telo:

if (k == 0)
return 1;

if (k == 1)
return a;

ll tmp = pow2(a, k / 2);
tmp = tmp * tmp;
if (k & 1)
tmp = tmp * a;
return tmp;

Ja sam napravio template funkciju zato sto nekad ima potrebe da se koristi n razlicitih tipova, pa da ne pisemo istu funkciju n puta

Slazem se, moze i ova moja u template funkciju, poenta je da je brza.

Kako se poredi sa obicnom rekurzivnom verzijom?

Tako sto ti K puta mnozis, a ja priblizno k log2.