[C++] potęga..

polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

Witam. Proszę o pomoc w zrobieniu takiego zadanka: Napisz program proszący o podanie kolejnej najmniejszej liczby w potędze 3, (tzn jeśli wpisujesz 27 to ma wyjść 81).

Kompletnie nie wiem, jak sie za to zabrac:/ A pewnie, dla wielu z was to jest kilka minut roboty, dlatego zwracam się o pomoc
Awatar użytkownika
kolanko
Użytkownik
Użytkownik
Posty: 1905
Rejestracja: 9 gru 2006, o 14:23
Płeć: Mężczyzna
Lokalizacja: Łańcut
Podziękował: 32 razy
Pomógł: 172 razy

[C++] potęga..

Post autor: kolanko »

Nie wiem czy dobrze rozumie,
najpierw sprawdz czy ta liczba jest potęgą 3, jesli jest to pomnóż tą liczbe przez 3 i masz wynik. w czym tu problem ?
polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

Tak to chodzi o to co myślisz. Ale niestety jest problem, jeśli ktoś w ogole nie łapie jezyka c++..
Da rade zrobic to zadanie?
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[C++] potęga..

Post autor: spajder »

Jasne, że się da.
1. Wczytujesz liczbę
2. Liczysz logarytm trójkowy tej liczby (masz funkcję log, która liczy logarytm naturalny, wystarczy zrobić log(x)/log(3) ze wzoru na zmianę podstaw logarytmu)
3a. jeśli x jest liczbą całkowitą to wypisujesz na ekran 3^(x+1) (funkcja pow daje potęgę)
3b. jeśli x nie jest liczbą całkowitą to liczysz sufit z tej liczby (funkcja ceil) i wypisujesz 3^(ceil(x))
polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

A czy punkt 2 da się jeszcze bardziej rozpisać?
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[C++] potęga..

Post autor: spajder »

Masz do dyspozycji (w bibliotece cmath) funkcję log, która zwraca logarytm naturalny. Jeśli chcesz policzyć logarytm trójkowy z \(\displaystyle{ x}\) wystarczy zastosować wzór na zamianę podstaw logarytmu:
\(\displaystyle{ \log_3{x}=\frac{\ln{x}}{\ln{3}}}\)

co na kod c++ przełoży się tak:

Kod: Zaznacz cały

double logarytm = log(x)/log(3);
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

[C++] potęga..

Post autor: Dumel »

matematycznie jest ok ale mogą być kłopoty z dokładnością obliczen bo ln3 jest niewymierne
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[C++] potęga..

Post autor: spajder »

Problemów nie będzie, jeśli tylko uwzględni się, że obliczenia nie są wykonywane dokładnie. Żeby sprawdzić, czy liczba x jest całkowita nie można napisać:

Kod: Zaznacz cały

if(x == static_cast<double>(static_cast<int>(x)));
czyli zwykłego rzutowania. Nie można tak napisać w ŻADNYM wypadku, przy liczeniu na zmiennoprzecinkowych (nawet jeśli dodajemy 1.0+2.0).

Trzeba sprawdzić, czy aby różnica między tą liczbą a podłogą (lub sufitem) nie jest dostatecznie mała:

Kod: Zaznacz cały

if(abs(x-floor(x)) < 0.00001 || abs(x-ceil(x) < 0.00001))
    // wtedy liczba jest całkowita
wartość \(\displaystyle{ 0,00001}\) została obrana arbitralnie.
polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

A ja nadal nie wiem co mam z tym zrobić?! Proszę o pomoc w napisaniu całego kodu.. Bo moje umiejętności skończyły się już tu:

Kod: Zaznacz cały

#include<iostream>
#include<math.h>
#include<cmath>
using namespace std;
double logarytm = log(x)/log(3);


int main()
{
    int n,i;
    cout<<
    
Tadrion
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 9 kwie 2008, o 20:55
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 1 raz

[C++] potęga..

Post autor: Tadrion »

Może program napisany niezgodnie z regułami C++ (bardziej jest to C niż C++ jednak ) i z algorytmem trochę brutalnym Jednak dla danych mieszczących się w podstawowym zakresie wykonuje to co ma wykonywać błyskawicznie.

Kod: Zaznacz cały

#include <cstdio>
#include <cmath>

unsigned int a,i;

int main()
{
  scanf("%d",&a);
  i=0;
  while( (int)pow(3,i) < a && (int)pow(3,i+1) <= a )
    i++;
    
  printf("%d
",(int)pow(3,i+1));

  return 0;
}

polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

Wieelkie dziękii, za pomoc. Jestem bardzo bardzo wdzięczna!
A jeszcze mam pytanko, jak mam do tego kodu dopisac

Kod: Zaznacz cały

cout<<"Podaj liczbe(wielokrotnosc 3)"<<endl;
cin>>a;
Bo jak to wstawiam na początku algorytmu to nie działa:/
Tadrion
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 9 kwie 2008, o 20:55
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 1 raz

[C++] potęga..

Post autor: Tadrion »

polcia_89 pisze:

Kod: Zaznacz cały

cout<<"Podaj liczbe(wielokrotnosc 3)"<<endl;
cin>>a;
Bo jak to wstawiam na początku algorytmu to nie działa:/
W moim kodzie nie ma dołączonej biblioteki iostream potrzebnej do obsługi funkcji cin/cout.

Dopisz w pierwszej linijce to co poniżej i powinno śmigać

Kod: Zaznacz cały

#include <iostream>
polcia_89
Użytkownik
Użytkownik
Posty: 86
Rejestracja: 23 lut 2009, o 13:37
Płeć: Kobieta
Lokalizacja: Katowice

[C++] potęga..

Post autor: polcia_89 »

Dziękuje bardzo:) Pozdrawiam
ODPOWIEDZ