Triangular number
Ostatnio zmodyfikowano 2021-03-05 21:14
gonskabalbinka Temat założony przez niniejszego użytkownika |
Triangular number » 2021-03-05 20:22:39 Triangula number to liczba punktów, które wypełniają trójkąt równoboczny. Taką liczbą jest np 6 bo trójkąt złożony z takiej liczby punktów ma wszystkie boki równe. Problem sprowadza się do rozwiązania równania T(n) = n*(n+1)/2. Po przekształceniach n^2+n-T(n)*2=0. T(n) jest daną szukaną jest n a właściwie to czy n jest liczbą całkowitą. Mój kod poniżej #include <stdbool.h>
bool is_triangular( int t ) { unsigned long long int delta = 1 + 8 * t; double x =( - 1 + sqrt( delta ) ) / 2.0; if( floor( x ) == x ) return true; return false; }
Program daje mi nieprawidłowe wyniki dla t == 458000245 i dla t == 1055770176 Nie wiem gdzie jest błąd |
|
pekfos |
» 2021-03-05 21:03:17 Przekraczasz zakres typu int robiąc 8 * t. |
|
gonskabalbinka Temat założony przez niniejszego użytkownika |
» 2021-03-05 21:08:26 delta ma typ unsigned long long int więc zakres jest chyba prawidłowy tak mi się wydaje (2^64) więc od 0 do 18 446 744 073 709 551 616 |
|
pekfos |
» 2021-03-05 21:10:09 t ma typ int i 8 ma typ int. Wynik jest w int. |
|
gonskabalbinka Temat założony przez niniejszego użytkownika |
» 2021-03-05 21:12:19 Próbowałem rzutować unsigned long long int delta = 1+8*(unsigned long long int)t; teraz działa. Dzięki za odpowiedzi |
|
pekfos |
» 2021-03-05 21:14:29 unsigned long long int delta = (unsigned long long int)1+8*t; Mnożenie jest pierwsze, zgodnie z matematyką i dalej tam robisz int razy int. Zrób rzutowanie na właściwym wyrazie. |
|
« 1 » |