Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Triangular number

Ostatnio zmodyfikowano 2021-03-05 21:14
Autor Wiadomość
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

C/C++
#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
P-178233
pekfos
» 2021-03-05 21:03:17
Przekraczasz zakres typu int robiąc 8 * t.
P-178234
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
P-178235
pekfos
» 2021-03-05 21:10:09
t ma typ int i 8 ma typ int. Wynik jest w int.
P-178236
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
P-178237
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.
P-178238
« 1 »
  Strona 1 z 1