Strona 1 z 1
[C++] potęga..
: 13 cze 2009, o 11:14
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
[C++] potęga..
: 13 cze 2009, o 12:29
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 ?
[C++] potęga..
: 13 cze 2009, o 17:43
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?
[C++] potęga..
: 13 cze 2009, o 18:14
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))
[C++] potęga..
: 13 cze 2009, o 21:29
autor: polcia_89
A czy punkt 2 da się jeszcze bardziej rozpisać?
[C++] potęga..
: 13 cze 2009, o 21:39
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:
[C++] potęga..
: 13 cze 2009, o 22:24
autor: Dumel
matematycznie jest ok ale mogą być kłopoty z dokładnością obliczen bo ln3 jest niewymierne
[C++] potęga..
: 13 cze 2009, o 22:40
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.
[C++] potęga..
: 14 cze 2009, o 11:47
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<<
[C++] potęga..
: 14 cze 2009, o 12:27
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;
}
[C++] potęga..
: 14 cze 2009, o 13:15
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:/
[C++] potęga..
: 14 cze 2009, o 13:53
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ć
[C++] potęga..
: 14 cze 2009, o 14:13
autor: polcia_89
Dziękuje bardzo:) Pozdrawiam