• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Potęgowanie liczby 3 w c++

Object Storage Arubacloud
0 głosów
2,592 wizyt
pytanie zadane 29 listopada 2020 w C i C++ przez Julka_99 Użytkownik (540 p.)
Znalazłam takie zadanie maturalne:

W pliku liczby.txt zapisano 500 liczb całkowitych dodatnich po jednej w każdym wierszu. Każda liczba jest z zakresu od 1 do 100 000. Napisz program(-y) dający(-e) odpowiedzi do poniższych zadań. Zapisz uzyskane odpowiedzi w pliku wyniki4.txt, poprzedzając każdą z nich numerem odpowiedniego zadania. Uwaga: Plik przyklad.txt zawiera przykładowe dane spełniające warunki zadania. Odpowiedzi dla danych z tego pliku są podane pod treściami zadań. Zadanie 4.1. (0–3) Podaj, ile z podanych liczb jest potęgami liczby 3 (czyli liczbami postaci 1 = 30 , 3 = 31 , 9 = 32 itd.).

Wpadłam na pomysł, żeby użyć tablicy i zawrzeć w niej te 100 000 liczb. Następnie zrobić potęgi liczby 3 aż do 100 000. Na samym końcu porównać liczby z pliku tekstowego do potęg, które wcześniej wyliczyłam i jeżeli się zgadzają to je zliczyć. Nie wiem tylko w jaki sposób to zapisać, szczególnie moment, kiedy muszę wyliczyć tyle potęg.
komentarz 29 listopada 2020 przez tkz Nałogowiec (42,000 p.)
Rozpisz sobie wszystkie potęgi 3, swoją drogą będzie ich 10. I właściwie tyle. http://www.cplusplus.com/reference/cmath/pow/ Możesz również użyć mapy. Rozwiązań jest wiele.
komentarz 29 listopada 2020 przez Julka_99 Użytkownik (540 p.)

Właśnie tak zrobiłam. Teraz pytanie jak je porównać. Zrobiłam coś takiego:

void zadanie4_1()
{
    int liczba;
    ifstream odczyt;
    odczyt.open("liczby.txt");
    ofstream zapis;
    zapis.open("wynik4_1.txt");
    while(odczyt>>liczba)
    {
        if(liczba==1);
            else if(liczba==3);
            else if(liczba==9);
            else if(liczba==27);
            else if(liczba==81);
            else if(liczba==243);
            else if(liczba==729);
            else if(liczba==2187);
            else if(liczba==6561);
            else if(liczba==19683);
            else if(liczba==59049);
            cout<<liczba;
    }
}

Ale to nie bardzo działa. Co powinnam zmienić?

komentarz 29 listopada 2020 przez tkz Nałogowiec (42,000 p.)
Zwróć uwagę na treść zadania. Pytają "ile", nie "jakie są". Więc ostatni cout jest zbędny. Brakuje czegoś co by zliczało te liczby. Dodaj licznik przed pętlą oraz inkrementuj licznik przy każdym spełnieniu wyrażenia warunkowego.
komentarz 29 listopada 2020 przez Julka_99 Użytkownik (540 p.)
Masz racje, trochę się rozpędziłam z tym cout. Bardzo dziękuję za pomoc
komentarz 29 listopada 2020 przez Julka_99 Użytkownik (540 p.)

@tkz, czy chodziło o coś takiego?

int liczba;
    int licznik=0;
    ifstream odczyt;
    odczyt.open("liczby.txt");
    ofstream zapis;
    zapis.open("wynik4_1.txt");
    while(odczyt>>liczba)
    {
        if(liczba==2)licznik++;
           else if(liczba==3)licznik++;

...

1
komentarz 29 listopada 2020 przez tkz Nałogowiec (42,000 p.)
Tak.

2 odpowiedzi

0 głosów
odpowiedź 29 listopada 2020 przez KopfSzmercen Bywalec (2,870 p.)

Ja bym radził podejść do tego matematycznie.  Można wykorzystać wzór na iloraz logarytmów. Czyli liczysz logarytm naturalny z 3 i logarytm naturalny  z danej liczby. Potem dzielisz jedno przez drugie i sprawdzasz czy jak liczba zaokrąglona w dół do całkowitej i w górę do całkowitej są takie same- jeśli tak to znaczy ze liczba jest całkowita co oznacza że liczba jest potęgą 3.

bool check(int number){

    double log1 = log(number);
    double log2 = log(3);

    double log3 = log1/log2;



    if (ceil(log3) == floor(log3))

    {

        return true;

    }

    else

    {

        return false;

    }  

}

 

komentarz 29 listopada 2020 przez Julka_99 Użytkownik (540 p.)
Właśnie też o tym myślałam, ale nie wiedziałam jak to zapisać. Wydaje się w sumie łatwe. Dzięki bardzo
komentarz 29 listopada 2020 przez SzkolnyAdmin Szeryf (86,400 p.)

@KopfSzmercen,
 
Błędne podejście. jak możesz operować na liczbach całkowitych, to na nich operujesz, a nie przechodzisz na floaty. Przybliżenie w jakimś przypadku sprawi, że algorytm okaże się fałszywy.

komentarz 29 listopada 2020 przez tkz Nałogowiec (42,000 p.)
W tym przypadku nie ma to znaczenia ze względu na mantysę i cechę double.
0 głosów
odpowiedź 29 listopada 2020 przez Whistleroosh Maniak (56,980 p.)
Poza metodami wymienionymi wcześniej jest jeszcze jeden prosty sposób na sprawdzenie czy liczba jest potęgą 3. Wystarczy dzielić daną liczbę przez 3 dopóki jest ona podzielna przez 3 i jeżeli na sam koniec otrzymasz 1 to znaczy, że liczba jest potęgą 3, a w przeciwnym wypadku znaczy, że nie jest potęgą 3.

W najgorszym wypadku wykonasz około 10 dzieleń, więc to będzie działało całkiem szybko, a nie będziesz musiała bawić się z liczbami zmiennoprzecinkowymi jak to było w tym pomyśle z logarytmem, ani nie będzie potrzeby pisania tych kilku ifów

Podobne pytania

0 głosów
3 odpowiedzi 1,670 wizyt
pytanie zadane 7 listopada 2018 w C i C++ przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 855 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...