ioanna_k Δημοσ. 14 Νοεμβρίου 2014 Δημοσ. 14 Νοεμβρίου 2014 Γεια σας! Έχω κάνει έναν κώδικα για μια εργασία που ζητάει τον υπολογισμό μιας ακολουθίας ν. #include <stdio.h> #include <math.h> int main() { int i,n; unsigned long long an,a; a=2; printf("Dose timi n\n"); scanf("%d",&n); for(i=1; i<=n; i++) { an=pow(a,5)-a; a=an; } printf("H timi tou %dorou einai %llu\n",n,an); } Για ν=1,ν=2 δουλεύει μια χαρά, όμως από κει και πέρα είτε μου βγάζει τον ίδιο αρνητικό αριθμό είτε μια θετικό και μια αρνητικό.. Τι κάνω λάθος;;;
imitheos Δημοσ. 14 Νοεμβρίου 2014 Δημοσ. 14 Νοεμβρίου 2014 Γεια σας! Έχω κάνει έναν κώδικα για μια εργασία που ζητάει τον υπολογισμό μιας ακολουθίας ν. an=pow(a,5)-a; a=an; } Για ν=1,ν=2 δουλεύει μια χαρά, όμως από κει και πέρα είτε μου βγάζει τον ίδιο αρνητικό αριθμό είτε μια θετικό και μια αρνητικό.. Τι κάνω λάθος;;; Πόσο κάνει χ = 2^5 - 2 ? Μετά πάρε αυτό το χ και πες μας πόσο κάνει χ^5 - χ.
Moderators Kercyn Δημοσ. 14 Νοεμβρίου 2014 Moderators Δημοσ. 14 Νοεμβρίου 2014 Για n = 5 το α θα γίνει: 30 2429970 9223372036854775808 (πραγματική τιμή 84.723.630.896.837.068.686.841.475.700.000) 0 0 Το 84.723.630.896.837.068.686.841.475.700.000 είναι πολύ μεγάλο για να χωρέσει στη μνήμη. Δες το overflow.
ioanna_k Δημοσ. 14 Νοεμβρίου 2014 Μέλος Δημοσ. 14 Νοεμβρίου 2014 Είναι πολύ μεγάλοι αριθμοί και οι δυο... Βασικά, η εκφώνηση της άσκησης λέει αυτό : Έστω η αναδρομική σχέση an=a5n-1-an-1 με α0=2. Να γράψετε πρόγραμμα στο οποίο να υπολογίζεται η τιμή του ν-οστου όρου όπου το ν εισάγεται από το πληκτρολόγιο. Σωστά δεν έχω καταλάβει;
Moderators Kercyn Δημοσ. 14 Νοεμβρίου 2014 Moderators Δημοσ. 14 Νοεμβρίου 2014 Ναι, αλλά είσαι σίγουρη ότι πρέπει να γίνει σε C; Γιατί αν πρέπει να γίνει σε C τότε πρέπει να χρησιμοποιήσεις κάποια βιβλιοθήκη για μεγάλους αριθμούς, όπως αυτή.
ioanna_k Δημοσ. 14 Νοεμβρίου 2014 Μέλος Δημοσ. 14 Νοεμβρίου 2014 Μόνο την C ξέρω προς το παρόν, τα αρχικά.. Είμαι αρχάρια.. Τέλος πάντων, ευχαριστώ πολύ για την βοήθεια!!
Moderators Kercyn Δημοσ. 14 Νοεμβρίου 2014 Moderators Δημοσ. 14 Νοεμβρίου 2014 Στο μάθημα αυτό δεν κάνετε κάποια γλώσσα; Γιατί μου φαίνεται περίεργο να σας ζητάνε να γράψετε πρόγραμμα ενώ δεν κάνετε κάποια γλώσσα. Σε matlab θα σου βγάζει σωστό αποτέλεσμα πάντως.
ioanna_k Δημοσ. 14 Νοεμβρίου 2014 Μέλος Δημοσ. 14 Νοεμβρίου 2014 Μόνο την C κάνουμε σε αυτό το εξάμηνο...
Technology fan Δημοσ. 14 Νοεμβρίου 2014 Δημοσ. 14 Νοεμβρίου 2014 Είναι πολύ μεγάλοι αριθμοί και οι δυο... Βασικά, η εκφώνηση της άσκησης λέει αυτό : Έστω η αναδρομική σχέση an=a5n-1-an-1 με α0=2. Να γράψετε πρόγραμμα στο οποίο να υπολογίζεται η τιμή του ν-οστου όρου όπου το ν εισάγεται από το πληκτρολόγιο. Σωστά δεν έχω καταλάβει; Ίσως βοηθήσει σε κάποιο βαθμό τις πράξεις με τους μεγάλους αριθμους... http://i.imgur.com/rb6tE2Q.gif οπότε άλλαξε το : an=pow(a,5)-a; με an=a*(a-1)*(a+1)*(pow(a,2)+1) Edit: Άκυρο, δεν είχα προσέξει οτι είναι ΤΟΣΟ μεγάλοι οι αριθμοί... post: #3
ggeo1 Δημοσ. 14 Νοεμβρίου 2014 Δημοσ. 14 Νοεμβρίου 2014 (επεξεργασμένο) Θα πρέπει να χρησιμοποιήσεις: printf("H timi tou %dorou einai %lld\n",n,an); Aλλάζεις δηλ το llu σε lld ,διότι η pow επιστρέφει double. 2η περίπτωση: Mπορείς απλά να χρησιμοποιήσεις a*a*a*a*a Sorry , εκανα λαθος ,ειναι πολυ μεγαλοι οι αριθμοι. 3η περίπτωση: To καλύτερο είναι οπως προαναφέρθηκε να χρησιμοποιήσεις κάποια βιβλιοθήκη για τόσο μεγάλους αριθμούς στην C Επεξ/σία 16 Νοεμβρίου 2014 από ggeo1
ioanna_k Δημοσ. 16 Νοεμβρίου 2014 Μέλος Δημοσ. 16 Νοεμβρίου 2014 Έσβησα το #include <math.h> και έβαλα αντί pow(a,5), a*a*a*a*a και βγαίνουν ως αποτέλεσμα μεγάλοι διαφορετικοί αριθμοί, οπότε πιστεύω έφτιαξε. Ευχαριστώ πολύ!!
imitheos Δημοσ. 16 Νοεμβρίου 2014 Δημοσ. 16 Νοεμβρίου 2014 Θα πρέπει να χρησιμοποιήσεις: printf("H timi tou %dorou einai %lld\n",n,an);Aλλάζεις δηλ το llu σε lld ,διότι η pow επιστρέφει double. Το format που βάζεις στην printf πρέπει να αντιστοιχεί με την μεταβλητή που της δίνεις οπότε με την an. Επίσης, το d τι σχέση έχει με τους double ? Έσβησα το #include <math.h> και έβαλα αντί pow(a,5), a*a*a*a*a και βγαίνουν ως αποτέλεσμα μεγάλοι διαφορετικοί αριθμοί, οπότε πιστεύω έφτιαξε. Ευχαριστώ πολύ!! Έφτιαξε το πρόβλημα που είχες με τους double οπότε δεν παίρνεις αποτέλεσμα 0 αλλά το πρόγραμμα σαν πρόγραμμα δεν έφτιαξε. Dose timi n 8 i=1 - an=30 i=2 - an=24299970 i=3 - an=9726009443040182878 i=4 - an=5428584676708858754 i=5 - an=13281342177021680798 i=6 - an=6920647425321817410 i=7 - an=6569075776711315166 i=8 - an=12212876023739389698 H timi tou 8orou einai 12212876023739389698 Αν βάλουμε σε κάθε στάδιο να εμφανίζεται ο αριθμός που προκύπτει, παίρνουμε τους παραπάνω αριθμούς. Όπως βλέπεις, ο 4ος αριθμός αντί να είναι μεγαλύτερος του τρίτου, είναι μικρότερος. Αυτό γίνεται γιατί ο πραγματικός αριθμός δεν μπορεί να αναπαρασταθεί και έτσι (λόγω του ότι χρησιμοποιείς unsigned αριθμούς) γίνεται υπερχείλιση. Το ίδιο παρατηρούμε και στο 6ο στάδιο με μικρότερο αριθμό και πάει λέγοντας. Το ίδιο σου εξήγησε ο Kercyn στο μήνυμα 3, ότι δηλαδή παίρνεις ένα αριθμό Χ ενώ η πραγματική τιμή που έπρεπε να πάρεις είναι η πολύ μεγαλύτερη Ψ.
ggeo1 Δημοσ. 16 Νοεμβρίου 2014 Δημοσ. 16 Νοεμβρίου 2014 Το format που βάζεις στην printf πρέπει να αντιστοιχεί με την μεταβλητή που της δίνεις οπότε με την an. Επίσης, το d τι σχέση έχει με τους double ? Έχεις δίκιο.Τα μπέρδεψα λίγο. Πάντως , μέχρι ένα όριο μπορείς να χρησιμοποιήσεις είτε llu είτε lld , απλά το lld θα δείξει σωστα μέχρι ένα όριο. Επομένως,η μόνη λύση είναι η χρησιμοποίηση κάποιας βιβλιοθήκης εδώ.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα