Faktoriális kíszámítása c++-ban

Faktoriális kíszámítása c++-ban
2016-03-28T20:10:22+02:00
2016-03-31T09:05:11+02:00
2022-12-03T10:00:36+01:00
zoli444
Sziasztok, egy programot kell írnom, amiben faktoriálist kell számolnom.
C++ -ban most kezdtem programozni és ez az első beadandó iskolai feladatom. Nem a feladat megoldása kell, csak egy kis rávezetés (ötlet a feladat megoldásában). Előre is köszönöm :).
Mutasd a teljes hozzászólást!
Csatolt állomány
Szia, a faktoriális értékét nem kell minden ciklus esetén kiszámolnod, hiszen sorban növekszik az értéke 1-től. Elég ha megtartod az előző értékét, és megszorzod az új ciklusszámláló értékével, és megkaptad a következő faktoriálist. Nagyjából ennyi a számolás része:

double calc(int i) { double fact = 1.0, res = 1.0; int n; for (n = 1; n <= i; n++) { fact *= n; res = (n & 1) ? res - 1/fact : res + 1/fact; } return 1/res; }
Vagy :)

#include <math.h> double calc() { return exp(1); }
Üdv.
Zoli
Mutasd a teljes hozzászólást!

  • És most milyen "lökést" vársz tőlünk? Mat. le tudod vezetni?

    Vagy mi nem megy? A C++?
    Mutasd a teljes hozzászólást!
  • Szia, inicializálsz egy integer változót, pl f=1, ez fogja tárolni a faktoriálist. Egy másik float vagy double típusú változónak, pl res-nek is beállítod az értékét 1.0-re, ez fogja tárolni az eredményedet. Aztán csinálsz egy ciklust 1-től i-ig. A cikluson belül mindig megszorzod f-et i-vel, és f-ben eltárolod az új faktoriálist, mert nem számoljuk ki minden egyes alkalommal.

    Most jön az eredmény számolása: megvizsgálod, hogy i páros vagy páratlan, és ennek megfelelően res-hez vagy hozzáadod vagy kivonod belőle az 1/f értékét.

    Vége a ciklusnak, 1/res lesz e értéke.

    Üdv.
    Zoli
    Mutasd a teljes hozzászólást!
  • Ha tényleg csak rávezetős megoldás kell:

    Faktoriális számítás:

    int whatIsTheFactorOf(int number){ int faktor = 1; for(int i=2; i<=number;i++){ faktor = faktor*i; } return faktor; }
    De ahogy látom, neked nem csak faktoriális kell. A sort hasonlóan ezzel a logikával tudod megcsinálni. Fog kelleni egy változó, amiben eltárolod a részeredményt, de itt már nem lesz elég az int. Továbbá kelleni fog egy változó, amivel jelzed, hogy + vagy - jön. Ez célszerű, hogy bool legyen. Pl. kivonás jön: false, összeadás jön true. A for ciklusban kiszámolod az 1/whatIsTheFactorOf(j) értékét, majd attól függően, hogy mi van a bool flagedben, hozzáadod, vagy kivonod a részeredményes változóhoz/ból. Ezután még a cikluson belül átállítod a bool változódat a másik értékre, hogy a következő futáskor már a másik ág fusson le.

    Ha nem akarsz bool flaget használni, az is elég, ha megnézed, hogy páros vagy páratlan faktoros tag jön, és aszerint adsz/vonsz ki.
    Mutasd a teljes hozzászólást!
  • (c++)-al van gondom. 
    Létre kell hoznom ugye, egy változót pl. n-t, amibe majd be kell vinnem egy bizonyos számot.
     Utána egy for ciklust ami i-től n-ig megy, vagyis a bevitt számig.
    Majd egy belső for, ami a faktoriális elemeket szorozza össze.
    Nem tudom most mi a következő lépés,hogy az e-t hogyan kapom meg. De  a kódban sem vok biztos.

    A kód :

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int main()
    {
    double fakt;
    int n;
    cout << "Kérem az n-t \n ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
    fakt = 1;
    for (int j = 1; j <= i; j++)
    }

    cout << e;
    system("PAUSE");

    }
    Mutasd a teljes hozzászólást!
  • Hali, indulj ki ebből (ez csak egy-ét számolja ki):
    (kiemelve az a rész, amit érdemes jobban tanulmányoznod)

    #include <iostream> int fakt(int n); using namespace std; int main () { int m; int faktor; cout << "Add meg a számot: "; cin >> m; faktor = fakt(m); cout << "Faktoriál: "<< faktor << endl; cin.get(); return 0; } // a faktorial számítást külön funkcióba tesszük int fakt(int n) { int fakt = 1, i; for (i = 1; i <= n; i++) fakt*=i; return fakt; }
    --[ui: legközelebb, ha  nem esik nehezedre, akkor használd a forráskód gombot.
    Mutasd a teljes hozzászólást!
  • Szia, a faktoriális értékét nem kell minden ciklus esetén kiszámolnod, hiszen sorban növekszik az értéke 1-től. Elég ha megtartod az előző értékét, és megszorzod az új ciklusszámláló értékével, és megkaptad a következő faktoriálist. Nagyjából ennyi a számolás része:

    double calc(int i) { double fact = 1.0, res = 1.0; int n; for (n = 1; n <= i; n++) { fact *= n; res = (n & 1) ? res - 1/fact : res + 1/fact; } return 1/res; }
    Vagy :)

    #include <math.h> double calc() { return exp(1); }
    Üdv.
    Zoli
    Mutasd a teljes hozzászólást!
  • Ennek "(n & 1)" mi az előnye a másikkal szemben azon kívül, hogy nem lesz egyértelmű első ránézésre?
    Mutasd a teljes hozzászólást!
  • nem akarok "hitvitát" indítani, de a "sok másikkal" szemben az az előnye, hogyha valaha is programoztál C-ben, akkor pont hogy ez a legegyértelműbb leírás első blikkre,

    szerkesztve: mondjuk abban igazad van, hogy a C++ témában indította a kérdését, és azt is írta, hogy C++-ban kell kódolnia... szóval nem kellene C-ben "gondolkodni", szerintem,

    szerkesztés szerkesztése: mielőtt valaki belekötne az utóbbiba, olyasmikre gondolok, hogy pld. math.h vs cmath (lásd az elfogadott megoldást) ...
    Mutasd a teljes hozzászólást!
  • Először is eggyel több tagot számolsz ki, mint kellene. Másodszor tényleg felesleges a paritásvizsgálat a cikluson belül.

    A javított változat:

    double calc2(int n) { double res = 0; if (n > 0) { res = 1.0; double den = 1.0; for (int i = 1; i < n; ++i) res += den /= -i; } return 1/res; }
    Mutasd a teljes hozzászólást!
  • Szia, nem számolok ki több tagot, a ciklusnak 1-től kell mennie a megadott számig. A te megoldásodban egyel előbb leáll a ciklus. Továbbá ha 0 eleme van a sornak, az eredmény akkor is 1.0, a te megoldásodban pedig hibát ad, mert nullával akarsz osztani. Mondjuk mindkét megoldásban az 1 elemű sorral ugyan ez történik...

    Egyébként igazad van, a te megoldásod (res += den /= -i;) sokkal szebb és egyszerűbb az enyémnél.

    Üdv.
    Zoli
    Mutasd a teljes hozzászólást!
  • Táblázat, n = hány tagig kell számolni az összeget, res pedig a sorozat első n tagjanak összege. (Összeg a 0. tagtól az n-1. tagig.)

    n res 1/res 0 0 inf 1 1/0! = 1 1 2 1/0!-1/1! = 0 inf 3 1/0!-1/1!+1/2! = 1/2 2 4 1/0!-1/1!+1/2!-1/3! = 1/3 3
    Nálad:

    i res 1/res 0 1 1 1 0 inf 2 1/2 2 3 1/3 3 4 3/8 2.666667
    Pont el van csúszva eggyel. Mert a 0-ik tagtól indul (ami már egy darab) plusz még hozzáadja a tagokat 1-től n-ig. Vagyis összesen n+1 tagot ad össze a sorozatban, pedig n tagot kéne.
    Tehát ahhoz, hogy pontosan n tagot adj össze, eggyel előbb kell megállni.

    (Ha nulla darab számot adsz össze, 0-t kéne kapj, nem pedig egyet.)

    A nullával való osztást direkt nem kezeltem le, az nem is volt cél. Azt a részt ugyanúgy hagytam, mint az eredetiben, hogy könnyebb legyen összehasonlítani a két kódot...
    Mutasd a teljes hozzászólást!
  • Szia, szerintem az én megoldásom a jó, ha jobban megnézed a képletet, így néz ki:

    1/e = 1 - 1/1! + 1/2! - 1/3! + ... 1/i!

    Tehát ha i=0, akkor az eredmény 1, ha i=1, akkor az eredmény 1/0.
    Ha esetleg nem látszana rendesen az 1- -on van a hangsúly.

    A program bekéri a sor elemeinek számát, majd ennek megfelelően kiszámolja az e értékét.

    Az én olvasatomban ez i értéke, ami ha 0, akkor is az 1, mint eredmény megjelenik.

    Üdv.
    Zoli
    Mutasd a teljes hozzászólást!
  • A diszkrepancia esszenciája a következő: nálam a calc2 paramétere az, hogy hány darab elemet kell összeadni, mert a feladat szerint a program be kell kérje a sor elemeinek a számát (darabszám), nálad viszont a calc paramétere nem a darabszám, hanem az utolsó tag indexe, mert csak. (Nem tudom miért.) Az utolsó elem indexe egyenlő darabszám minusz eggyel, tehát ha 5 elemet kell összeadni, akkor calc2(5) == calc(4), mindkettő a helyes értéket adja. Tehát ilyen értelemben mindkét megoldás jó. (Marginális differencia appercipiálható a calc2(0) versus calc(-1) eset analízise során, de ez a notícia a kötelező szőrszálhasogatás okán került ide.)
    Mutasd a teljes hozzászólást!
  • #include <iostream> #include <math.h> using namespace std; int main() { //Valtozok int Bemenet = 1; double Kimenet = 1, Fakt = 1; //Euler Szam meghatarozasa while (Bemenet > 0) { //Bevitel cout << "Kerek egy pozitiv egesz szamot:"; cin >> Bemenet; //Szamitas for (int j = 1; j <= Bemenet; j++) { //Faktorialis for (int i = 1; i <= j; i++) { Fakt *= i; } Kimenet += (pow(-1, j))*(1/Fakt); Fakt = 1; } //Kivitel cout << "Az eredmeny:" << Kimenet << endl; Kimenet = 1; } return 0; }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd