Pierwiastek 3 stopnia

0

Cześć, mam kod na pierwiastek 3 stopnia z n ale mam też ograniczenia.
1 <= N <= 10^18.

#include <iostream>
#include <cmath>

using namespace std;
int
main ()
{
  long double a, b=3,c ;
    {
      cin >> a;
      c = pow (a, (1 / b));
      cout << c << endl;
    }
  return 0;
}

Co należy poprawić ?

1

Pytanie!
Napisz co jest źle, (przypuszczalnie w treści zadania masz jakieś obostrzenia, o których nie piszesz)!
Na pierwszy rzut oka działa: https://wandbox.org/permlink/1nGKVxNwKHMmRbl4

0
MarekR22 napisał(a):

Pytanie!
Napisz co jest źle, (przypuszczalnie w treści zadania masz jakieś obostrzenia, o których nie piszesz)!
Na pierwszy rzut oka działa: https://wandbox.org/permlink/1nGKVxNwKHMmRbl4

Zadanie:
http://solve.edu.pl/tasks/view/38

kod z testami

#include <iostream>
#include <cstdlib>
#include <math.h>
 
using namespace std;
 
int main()

{
   long int t;
   cin >> t;
   while(t--)
   
  long double a, b=3,c ;
    {
      cin >> a;
      c = pow (a, (1 / b));
      cout << c << endl;
    }
  return 0;
}

0
while(t--)

  long double a, b=3,c ;
    {
      cin >> a;
      c = pow (a, (1 / b));
      cout << c << endl;
    }

pytanie. Co zrobi ten while i dlaczego tylko long double a, b=3,c ; ta linijke? reszta kodu jest wykonywana raz

0

while to licznik testów

0

:D while to petla, ta petla wykona tylko jedna instrukcje bo nie masz {} po petli tylko po long double a, b=3,c ; instrukcji

Opdal sobie debuggera to zobaczysz, ze Twoj blok {} wykonuje sie raz

0
fasadin napisał(a):

:D while to petla, ta petla wykona tylko jedna instrukcje bo nie masz {} po petli tylko po long double a, b=3,c ; instrukcji

Opdal sobie debuggera to zobaczysz, ze Twoj blok {} wykonuje sie raz

Mam taki kod do licznika testów

int main()
{
   int t;
   cin >> t;
   while(t--)
   {
        

// tu właściwe wyliczenia pierwiastka


   }
   return 0;
}

0

Trzeba czytać treść zadanie ze zrozumieniem!!!
Przecież ten (pierwszy) kod nie robi nic zgodnie z treścią zadania!
Już sam początek treści jest przez ciebie zignorowany:

W pierwszym wierszu wejścia znajduje sie˛ jedna liczba naturalna Q, określająca liczbę zapytań

Zresztą zadanie jest trudniejsze niż się na pierwszy rzut oka wydaje bo 1 \le N \le 10^{18}
Czyli zwykłym double lub int tego nie załatwisz.

unsigned int cubicRootInt(uint64_t n);

int main()
{
   int t;
   std::cin >> t;
   while (t--) {
       uint64_t n;
       std::cin >> n;
       std::cout << cubicRootInt(n) << '\n';
   }
   return 0;
}
0

Mam taki kod z testami:

#include <iostream>
#include <math.h>

using namespace std;

int
main ()
{
  long long int liczba;
  double stopien = 3, wynik;
  int e, t;
  cin >> t;
  while (t != 0)
    {
      cin >> liczba;
      wynik = pow (liczba, 1.0 / stopien);
      e = wynik;
      if (wynik - e != 0)
	{

	}
 
	{
	  cout << e << endl;
	}
      t--;
    }
  return 0;
}

ale nie działą :-(

0

Nie działa i nie zadziała. To: pow (liczba, 1.0 / stopien) nie policzy ci poprawnego wyniku. Trzeba się jednak wysilić i użyć jakiejś metody Newtona.
https://rosettacode.org/wiki/Nth_root

1

Albo cos takiego (na unsigned long long int), za so i Hackers Delight:

using ull_int =  unsigned long long int  ;

ull_int icbrt2(ull_int x) {
   int s;
   ull_int y, b, y2;

   y2 = 0;
   y = 0;
   for (s = 30; s >= 0; s = s - 3) {
      y2 = 4*y2;
      y = 2*y;
      b = (3*(y2 + y) + 1) << s;
      if (x >= b) {
         x = x - b;
         y2 = y2 + 2*y + 1;
         y = y + 1;
      }
   }
   return y;
}

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