Problem z silnią w funkcji

Problem z silnią w funkcji
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0
Kopiuj
#include <iostream>
#include <cstdlib>
 
 
 
 
using namespace std;
 
int wynik = 1;
int obliczaniesilni(int x)
{
    for (int i=x; i == 0 ; i--) {
        wynik = wynik *i;

    }
    return wynik;
}
 
int main() {
 
   
    int liczba;
    cout << "Podaj liczbe:";
    cin >> liczba;
 
    cout << obliczaniesilni(liczba);
    return 0;
}

Witam to jest mój kodzik, mam napisać w funkcji silnię iteracyjnie, lecz na czymś się zawiesiłem, chyba moj algorytm nie jest idealny, pomoze ktos?

edytowany 3x, ostatnio: kq
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Szczecin
3

Dlaczego wynik jest zmienną globalną? Ogółem, to poza tą zmienną wynik (i jej jednokrotnym ustawieniem) chyba jest ok, tylko silnia rośnie bardzo szybko i już 13! nie zmieści się w int na typowych architekturach.


_13th_Dragon
Dlaczego? Bo kompilator nie protestuje więc dobrze! ;P
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:9 minut
3

Silnia szybko rośnie, ergo już dla niewielkiego argumentu przekroczysz zakres typu int.
Może podaj jaki problem rozwiązuje twój kod, bo jest parę trików obchodzących limit zakresu liczb całkowitych.
Można też napisać kod, który pozwala na obliczenia na dowolnie dużych liczbach całkowitych, limitem będzie tylko ilość pamięci.

A ta zmienna globalna psuje wynik, nawet dla małych argumentów. Tego problemu pewnie nie widzisz, bo twój program wywołuję funkcję tylko raz.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
Sunnydev
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Nether
  • Postów:235
3

Pętla z aktualnym warunkiem nie wykona się ani razu, albo raz, ale tylko jeśli użytkownik wprowadzi 0!


lubię tylko w c++ i w rust i w go i w haskell. pythona nie lubię, javy też. c# toleruję.
kq
Phew, racja
MarekR22
chyba ślepy jestem ;)
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

no wlasnie nie chodzi mi o sam wybór inta, bo wybrałem go po prostu dla wygody w celu sprawdzenia algorytmu
chodzi mi wlasnie ze program się kompiluje i działa, ale wyniki to 1 albo 0 niezaleznie co wpisze, dlatego mysle ze coś z petla jest nie tak i zastanawiam się co.

CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

bo pętlę napisałem od końca, czyli wg mojej "logiki" pętla iteruje z wartością początkową x w dół, aż napotka 0

Zobacz pozostały 1 komentarz
CR
czyli nie da się zrobić pętli for z początkowym i = x, iterującym w dół? więc muszę to wykonać w pętli while przy użyciu ifa?
MarekR22
da się, ale trzeba poprawić warunek. Przeczytaj uważnie co ci napisał.
CR
a no to tak jak myślę i wiem że jest zły, ale nie mam pojęcia jak napisać środkowy ( ten kończący)
MarekR22
to nie jest warunek kolończycy, ale warunek kontynuowania pętli!
CR
czyli for(int i=x;i>0;i--)?
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

tak wiec jak doszlismy do tego w komentarzach, to jest prawidłowa pętla do tego zadania:
for(int i=x;i>0;i--)

do zamkniecia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.