Υπολογισμός του e

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

Υπολογισμός του e

Δημοσίευση από Connor MacLeod » 15 Νοέμ 2011 17:23

Εχω κανει αυτο το πραγμα που με βαση αυτον το τυπο:
Εικόνα
υπολογίζει το e.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <math.h> 

int main &#40;&#41;
&#123;
    float i;
    float p1;
    p1=1;
    float p2;
    p2=1;
    float p3;
    p3=1;
    float p4;
    p4=1;
    float dieresi1;
    float dieresi2;
    float dieresi3;
    float dieresi4;
    float finalResult;
    for &#40;i=1;i<=1;i++&#41;
    &#123;
        p1=p1*i;
        &#125;
    for &#40;i=1;i<=2;i++&#41;
    &#123;
        p2=p2*i;
        &#125;
    for &#40;i=1;i<=3;i++&#41;
    &#123;
        p3=p3*i;
        &#125;
    for &#40;i=1;i<=4;i++&#41;
    &#123;
        p4=p4*i;
        &#125;
    dieresi1=1/p1;
    dieresi2=1/p2;
    dieresi3=1/p3;
    dieresi4=1/p4;
    finalResult=1+dieresi1+dieresi2+dieresi3+dieresi4;
    printf&#40;"To e einai peripou %.4f\n\n",finalResult&#41;;
    system&#40;"pause"&#41;;
&#125;
Αυτο δουλευει.
Βασικα θελω να ρωτήσω αν υπάρχει καποιος ποιο συντομος τρόπος να το φτιάξω εκτος απο ολο αυτο το κατεβατο.

Ευχαριστω για το χρόνο σας,
Connor-ας.
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

katerinaaa
Δημοσιεύσεις: 109
Εγγραφή: 28 Ιαν 2010 12:46

Υπολογισμός του e

Δημοσίευση από katerinaaa » 15 Νοέμ 2011 17:54

Να προσπαθείς πάντα να φτιάχνεις συναρτήσεις. Με αυτό τον τρόπο είναι πιο ευανάγνωστος ο κώδικας.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h> 

long factorial&#40;int n&#41;
&#123;
   int c;
   long result = 1;
 
   for&#40; c = 1 ; c <= n ; c++ &#41;
         result = result*c;
 
   return &#40;result&#41;;
&#125;

int main&#40;&#41;
&#123;
    float sum =1;
    int i;
    
    for&#40;i=1;i<=4;i++&#41;
        sum = sum + &#40;float&#41;1/factorial&#40;i&#41;;
    
    printf&#40;"E=%f",sum&#41;;
    
system&#40;"pause"&#41;;    
return 0;    
&#125;

Μπορείς να χρησιμοποιήσεις και αναδρομική συνάρτηση για πιο λίγο κώδικα.

Κώδικας: Επιλογή όλων

long factorial&#40;int n&#41;
&#123;
   if&#40;n==0&#41;
      return&#40;1&#41;;
   else
      return&#40;n*factorial&#40;n-1&#41;&#41;;
&#125;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Υπολογισμός του e

Δημοσίευση από dva_dev » 15 Νοέμ 2011 20:45

Αν πάμε να χρησιμοποιήσουμε τον μαθηματικό τύπο για να αποφύγουμε τις επαναλήψεις και τις αναδρομές μπορεί να γίνει έτσι

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>

float factorial&#40;int x&#41;
&#123;
	if &#40;x>1&#41;
		return x*&#40;x+1&#41;/2;
	return 1.0;
&#125;

int main&#40;&#41;
&#123;
    float sum = 1;
    int i;

    for&#40;i=1; i<=4; i++&#41;
    &#123;
        sum = sum + 1.0/factorial&#40;i&#41;;
    &#125;

    printf&#40;"E=%f\n",sum&#41;;

    return 0;
&#125;
ή
Στηριζόμενοι στο γεγονός ότι το x! είναι (x-1)!*x αν με κάποιο τρόπο είχαμε κρατήσει το (x-1)! θα μπορούσαμε απλά να κάνουμε την επιπλέον πράξη *x ο κώδικας θα μπορούσε χωρίς αναδρομική ή επαναληπτική συνάρτηση να γίνει

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>

int main&#40;&#41;
&#123;
    float sum = 1;
    long factorial = 1;
    int i;

    for&#40;i=1; i<=4; i++&#41;
    &#123;
        factorial = factorial * i;
        sum = sum + &#40;1.0/factorial&#41;;
    &#125;

    printf&#40;"E=%f\n",sum&#41;;

    return 0;
&#125;

Άβαταρ μέλους
Connor MacLeod
Honorary Member
Δημοσιεύσεις: 13372
Εγγραφή: 07 Φεβ 2005 13:36
Τοποθεσία: Κοζάνη
Επικοινωνία:

Υπολογισμός του e

Δημοσίευση από Connor MacLeod » 15 Νοέμ 2011 20:48

ψψψψψψ, καλα εσεις πετατε
:P

Θα τα δοκιμάσω τωρα, και πρεπει να δω τι κανει και το int μπροστα απο το main.
Αυτο δε το ξερω ακομα.
:P
Meizu MX5(5.5"/8Core/3GB/32GB/Sony IMX220 20.7MP)
PC 27'' (3770@3.4/16GB/560SE/500GB SATA3/650W S12G)
Mac mini (2.5GHz/8GB/6630/90GB GorsairGT)

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

Υπολογισμός του e

Δημοσίευση από xmavidis » 15 Νοέμ 2011 23:00

Με το int main() το πρόγραμμα γυρνάει έναν integer στο λειτουργικό. Το return 0 σημαίνει επιτυχής εκτέλεση του προγράμματος.
I want to know God’s thoughts; the rest are details.
Albert Einstein

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

Υπολογισμός του e

Δημοσίευση από mariosal » 10 Απρ 2012 22:06

dva_dev έγραψε:

Κώδικας: Επιλογή όλων

float factorial&#40;int x&#41;
&#123;
	if &#40;x>1&#41;
		return x*&#40;x+1&#41;/2;
	return 1.0;
&#125;
Αυτή η function, dva_dev, επιστρέφει το summation από 1..n. Εικόνα

Ο τύπος του factorial είναι: Εικόνα

Κώδικας: Επιλογή όλων

int factorial&#40; int n &#41; &#123; 
    if &#40; !n &#41; &#123; 
        return 1;
    &#125;   
    return n * factorial&#40; n - 1 &#41;;                                                        
&#125;

Έπειτα χρησιμοποιώντας την exp() της math.h ο τελικός κώδικας απλοποιείται και γίνεται έτσι:

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <math.h>

int main&#40;&#41; &#123;
    printf&#40; "e = %.15lf\n", exp&#40; 1 &#41; &#41;;

    return 0;
&#125;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Υπολογισμός του e

Δημοσίευση από dva_dev » 10 Απρ 2012 23:38

mariosal έγραψε:
dva_dev έγραψε:

Κώδικας: Επιλογή όλων

float factorial&#40;int x&#41;
&#123;
	if &#40;x>1&#41;
		return x*&#40;x+1&#41;/2;
	return 1.0;
&#125;
Αυτή η function, dva_dev, επιστρέφει το summation από 1..n. Εικόνα
Εχεις δίκιο (άλλωστε τα μαθηματικά μου έχουν σκουριάσει προ πολλού) αλλά ο στόχος ήταν να αποφύγουμε την αναδρομική κλήση και να την αντικαταστήσουμε με επαναληπτική.
Οπότε αν το κάνουμε έτσι καλά είναι;

Κώδικας: Επιλογή όλων

float factorial&#40;int x&#41;
&#123;
   float f;
   for &#40;f=1.0; x>1; --x&#41; f *= x;
   return f;
&#125;
Γράψε άκυρο, την επαναληπτική πρόταση την έχει κάνει ήδη η katerinaaa

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

Υπολογισμός του e

Δημοσίευση από mariosal » 11 Απρ 2012 00:30

dva_dev έγραψε:ο στόχος ήταν να αποφύγουμε την αναδρομική κλήση και να την αντικαταστήσουμε με επαναληπτική
Η αναδρομή δεν είναι πάντα χειρότερη από την επανάληψη και ως προγραμματιστές μας ενδιαφέρει κυρίως να έχουμε έναν ευκολοκατανόητο και γρήγορο αλγόριθμο.

Συγκεκριμένα το αναδρομικό factorial μου φαίνεται πιο απλό και κατανοητό από το επαναληπτικό. Διότι έχει μία βασικη υπόθεση το n = 0 και έπειτα μία πολύ μικρή αναδρομική κλήση. Έπειτα η πολυπλοκότητες των δύο αλγορίθμων είναι ακριβώς οι ίδιες, Θ( n ).

Βέβαια υπάρχουν περιπτώσεις που η απλή αναδρομή είναι ΠΟΛΥ χειρότερη από την επανάληψη. Π.χ. οι αριθμοί Fibonacci.

Κώδικας: Επιλογή όλων

int fib&#40; int n &#41; &#123;
    if &#40; !n &#41; &#123;
        return 0;
    &#125;
    if &#40; n == 1 &#41; &#123;
        return 1;
    &#125;
    return fib&#40; n - 1 &#41; + fib&#40; n - 2 &#41;;                                                   
&#125;
Είναι καθαρό ότι κάποια πράγματα διπλομετρούνται. Π.χ. Το αρχικό fib( n - 2 ) θα ξαναυπολογιστεί στο fib( n - 1 ) του αρχικού fib( n - 1 ). Με αποτέλεσμα να έχουμε έναν αλγόριθμο με πολυπλοκότητα Θ( 2^n ), αν δεν κάνω λάθος.

Ενώ επαναληπτικά με έναν κατά φαντασίαν δυναμικό προγραμματισμό γίνεται ως εξής με πολυπλοκότητα Θ( n ), δραματικά καλύτερη από την Θ( 2^n ).

Κώδικας: Επιλογή όλων

fib&#91; 0 &#93; = 0;
fib&#91; 1 &#93; = 1;
for &#40; i = 2; i <= n; ++i &#41; &#123; 
    fib&#91; i &#93; = fib&#91; i - 1 &#93; + fib&#91; i - 2 &#93;;                                           
&#125;
Φυσικά η αναδρομική έκδοση μπορεί να βελτιωθεί και αυτή σε Θ( n ) χρησιμοποιώντας memoization. Αλλά το point μου ήταν ότι αναλόγως τον αλγόριθμο κάποιες φορές η αναδρομή είναι καλύτερη επιλογή από την επανάληψη. :wink:

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27629
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Υπολογισμός του e

Δημοσίευση από cordis » 11 Απρ 2012 01:59

ωραίος ο Μάριος ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
DGeorge
Honorary Member
Δημοσιεύσεις: 3753
Εγγραφή: 13 Σεπ 2007 12:59
Τοποθεσία: Καλλιθέα Γενικώς

Υπολογισμός του e

Δημοσίευση από DGeorge » 11 Απρ 2012 11:50

Να 'παίξω' κι εγώ με τέσσερεις μεταβλητούλες :D
Υπ'όψιν: Δεν γνωρίζω τον κώδικά σας, γι'αυτό θα γράψω 'γενικά' :P
Οι μεταβλητές:
I - ο μετρητής 'κύκλων - loops' (ακέραιος - integer)
J - ο παραγοντικός αριθμός ' Ν! ' (ακέραιος - integer)
Ν - το πλήθος των κλασμάτων - δίνεται από τον χρήστη (ακέραιος - integer)
e - ο "αριθμός του Connorα" (πραγματικός - real)

________________________________________________________________

'Εισαγωγή του Ν'
e=1 J=1

for I=1 to N
J=J*I
e=e+(1/J)
next I

'Έξοδος του e (Οθόνη, Εκτυπωτής, κλπ)
_________________________________________________________________

Υποψιάζομαι ότι πρέπει να λειτουργεί, όπως επίσης και να μην έπεσα ακριβώς πάνω στην ιδέα κάποιου από τους προηγούμενους φίλους :) :)

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες