[c++]maly problem

0

Witam! Dopiero od niedawna programuje w c++ i natknalem sie na taki problem.

struct node{
       string login;
       unsigned int hits;
       node *left,*right;
       int layer;
}

unsigned long long hits=0;

node * current=root;

hits+=current->right->layer*current->right->hits;
 

jest to fragment mojej implementacji iteracyjnego uzupelniania drzewa BST. Dla mniejszych liczb nie ma zadnego problemu ale pojawia sie on gdy layer=3 oraz hits=2147483647(moja maksymalna wartosc). Zamiast pomnozyc to dostaje 2147483645.

Domyslam sie ze to cos nie tak z typami(zly ich dobor do arytmetyki pewnie).

Bede wdzieczny za szybka odpowiedz.

0

może po prostu zastosuj long long i po sprawie?

0

problem pozostal. Dla mnozenia 42147483647 dosjae wynik dla 22147483647...w ogóle nie rozumiem na czym polega blad.

0

Spróbuj w tym mnożeniu current->right->layer*current->right->hits rzutować któryś z czynników na unsigned long long.

0

wykonalem rzutowanie (long long)(current->right->layer)*(long long)(current->right->hits) i problem rzeczywiscie zniknal:) Dzieki wielkie :)

0

Jeszcze jedna sprawa:wiecie jak efektywnie sparsowac input w takiej sytuacji:
aaabb 12345 789
aby mi od razu wyciagnal tylko aaabb i 789 z pominieciem 12345? Trzeba to zrobic jak string,podzielic na tokeny i potem rzutowac typem liczbowym czy jest inny sposob?

0
sscanf(str, "%s %d %d", buf, &tmp, &num);
0

a to w c++ nie jest wskazane uzywanie cin zamiast scanf?

0

Nie. cin jest bezpieczniejsze ale wolniejsze od scanf. Jak tak bardzo nie chcesz używać sscanf to użyj stringstream

0
Jared napisał(a)

a to w c++ nie jest wskazane uzywanie cin zamiast scanf?

cstdio jest częścią biblioteki standardowej języka c++ czyli może być ona wykorzystywana dowolnie w tymże języku lecz nie powinna być mieszana z obiektami cin i cout.

0

cin jest bezpieczniejsze ale wolniejsze od scanf
jedno i drugie się sypie i zostawia w buforze śmieci, gdy użytkownik poda bzdury.

0

Tru, ale mi się wydaje, że czyszczenie cin'a jest trochę prostsze :)

0

off topic: do autora: przeczytaj regulamin i się do niego stosuj na przyszłość
(chodzi oczywiście o nazwę tematu).

Proszę poprawić.

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