GREGKERKYRA Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Μας δώθηκε το παρακάτω ερώτημα: 1. Δίδονται δύο μονοδιάστατοι πίνακες Α και Β μεγέθους 100. Σε κάθε πίνακα είναι αποθηκευμένα τα ψηφία ενός πολυψήφιου ακέραιου αριθμού με πλήθος ψηφίων μικρότερο του 100. Π.χ. ο αριθμός 123 θα είναι αποθηκευμένος στον πίνακα Α ως εξής Α(1)=3, Α(2)=2, Α(3)=1 με όλα τα υπόλοιπα στοιχεία μηδενικά. Να εκπονηθεί αλγόριθμος που θα εκτελεί την πρόσθεση των αριθμών που βρίσκονται στους δύο πίνακες. Το αποτέλεσμα θα παρέχεται σε έναν τρίτο πίνακα C. Λύση Αλγόριθμος Πρόσθεση_πολυψήφιων_ακεραίων Δεδομένα // Α(), B() // carry ← 0 Για i από 1 μέχρι 100 sum ← A(i) + B(i) + carry Αν sum < 10 τότε C(i) ← sum : carry ← 0 αλλιώς C(i) ← sum – 10 : carry ← 1 Τέλος_αν Τέλος_επαναληψης Αποτελέσματα // C() // Τέλος Πρόσθεση_πολυψήφιων_ακεραίων Η πρόσθεση όπως βλέπετε είναι ερκετά εύκολη. Μπορει κάποιος να βοηθήσει πως θα γίνει πολλαπλασιασμός ή αφαίρεση; Θα πέσει δέυτερη εξεταστική , παρακαλώ τα φώτα σας... αν δν σας βολέυει ο ψευδοκώδικας πείτε μου σε C/C++.
virxen75 Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 δες εδώ http://www.adslgr.com/forum/showthread.php?t=365207
GREGKERKYRA Δημοσ. 24 Φεβρουαρίου 2010 Μέλος Δημοσ. 24 Φεβρουαρίου 2010 δες εδώhttp://www.adslgr.com/forum/showthread.php?t=365207 Το κοίταξα αλλά ολοκληρωμένη λύση δεν βρήκα, αν την έχεις μπορείς να μου την στείλεις με πμ;
billidani7 Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 Ελα ρε ΤΕΙ Αθηνας...... Λοιπον το μαθημα το χω περασει σε προηγουμενη εξεταστικη που τα θεματα δεν ειχαν καμια σχεση με αυτα(ηταν πιο δυσκολα).Θα σου δωσω μια κατευθυνση για το πως να σκεφτεις. Ολες οι πραξεις αναγονται σε μια.Την προσθεση.Επομενως για το πολλαπλασιασμο θα σκεφτεις ως εξης.Εφοσον εχεις ετοιμο τον κωδικα της προσθεσης, θα τον χρησιμοποιησεις για να κανεις και τον πολλαπλασιασμο. Τι θα πει 3 φορες το 12?θα πει 12+12+12.Επομενως θα εχεις ενα βοηθητικο πινακα που θα κραταει τα αποτελεσματα τον προσθεσεων.Αρα μια επαναληπτικη διαδικασια που θα εκτελει την προσθεση,οπως ακριβως την δειχνει ο Κοιλιας(ο καθηγητης), για οσες φορες πρεπει.Αν σκεφτεις ετσι θα φτασεις γρηγορα στη λυση Οσο αφορα την αφαιρεση σκεψου το εξης.Αν Α(ι) < Β(ι) τοτε πρεπει να προσθεσεις 10 στο Α(ι) και να κανεις το carry=1 και μετα το κρατουμενο να το προσθεσεις στο Β(ι) της επομενης επαναληψης.Οπως ακριβως θα εκανες και αν εκανες την πραξη με το χερι.. Σαν παλιοτερος που ειμαι ας μου επιτραπει ενα σχολιο.Περαστε τωρα που βαζει ευκολα.Το πρωτο θεμα ειναι επιπεδου τριτης λυκειου και πιανει 5.Αν δινατε τα προηγουμενα εξαμηνα θα βλεπατε οτι τα θεματα που ηθελαν αμεσα και σειριακα αρχεια επιαναν 7 μοναδες.Τωρα με πινακες πας στο 5.
virxen75 Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 ΑΦΑΙΡΕΣΗ ================= > #include <stdio.h> #include <stdlib.h> int main(){ int A[]={8,6,4,3}; int B[]={7,5,9,1}; int C[5]={0}; int carry=0; for (int i=0;i<4;i++){ if (A[i]>=(B[i]+carry)){ C[i]=A[i]-B[i]-carry; carry=0; }else{ C[i]=10+A[i]-B[i]-carry; carry=1; } } printf("\nresult:"); for (int i=0;i<5;i++) printf("%d",C[i]); return 0; }
GREGKERKYRA Δημοσ. 24 Φεβρουαρίου 2010 Μέλος Δημοσ. 24 Φεβρουαρίου 2010 Την αφαίρεση την κατάφερα και εγώ μοιάζει αρκετά με το δικό σου, αλλά απο ότι βλέπω δουλεύει σωστά μόνο αν ο αριθμός στο Α() είναι μεγαλύτερος απο τον αριθμό στο Β(), εννοώ ολόκληρο των αριθμό οχι ένα στοιχείο. Αλλιώς θα επρεπε να βγάζει αρνητικό αποτέλεσμα, τώρα δν ξέρω αν θα ζητήσει κάτι τόσο τραβηγμένο. Εκτος αν αλλάξει κ η εκφώνηση και ζητάει πχ στην πρώτη θέση του πίνακα να μπαίνει κ το πρόσημο. Σε ευχαρηστω! ---------- Προσθήκη στις 14:45 ---------- Προηγούμενο μήνυμα στις 13:34 ---------- Ελα ρε ΤΕΙ Αθηνας......Λοιπον το μαθημα το χω περασει σε προηγουμενη εξεταστικη που τα θεματα δεν ειχαν καμια σχεση με αυτα(ηταν πιο δυσκολα).Θα σου δωσω μια κατευθυνση για το πως να σκεφτεις. Ολες οι πραξεις αναγονται σε μια.Την προσθεση.Επομενως για το πολλαπλασιασμο θα σκεφτεις ως εξης.Εφοσον εχεις ετοιμο τον κωδικα της προσθεσης, θα τον χρησιμοποιησεις για να κανεις και τον πολλαπλασιασμο. Τι θα πει 3 φορες το 12?θα πει 12+12+12.Επομενως θα εχεις ενα βοηθητικο πινακα που θα κραταει τα αποτελεσματα τον προσθεσεων.Αρα μια επαναληπτικη διαδικασια που θα εκτελει την προσθεση,οπως ακριβως την δειχνει ο Κοιλιας(ο καθηγητης), για οσες φορες πρεπει.Αν σκεφτεις ετσι θα φτασεις γρηγορα στη λυση Οσο αφορα την αφαιρεση σκεψου το εξης.Αν Α(ι) < Β(ι) τοτε πρεπει να προσθεσεις 10 στο Α(ι) και να κανεις το carry=1 και μετα το κρατουμενο να το προσθεσεις στο Β(ι) της επομενης επαναληψης.Οπως ακριβως θα εκανες και αν εκανες την πραξη με το χερι.. Σαν παλιοτερος που ειμαι ας μου επιτραπει ενα σχολιο.Περαστε τωρα που βαζει ευκολα.Το πρωτο θεμα ειναι επιπεδου τριτης λυκειου και πιανει 5.Αν δινατε τα προηγουμενα εξαμηνα θα βλεπατε οτι τα θεματα που ηθελαν αμεσα και σειριακα αρχεια επιαναν 7 μοναδες.Τωρα με πινακες πας στο 5. Αυτό προσπαθώ να κάνω με τον πολλαπλασιασμό, πολλαπλές προσθέσεις οσες είναι ο δέυτερος αριθμός, απλά δν ξέρω αν είναι βέλτιστη λύση(πολλές επαναλήψεις) Ασε τραβάω τα μαλιά μου που δεν πήγα πρώτη εξεταστική , πέρναγες και τουρίστας α πήγαινες...
virxen75 Δημοσ. 24 Φεβρουαρίου 2010 Δημοσ. 24 Φεβρουαρίου 2010 για την αφαίρεση μπορείς με μία for να διατρέξεις τα στοιχεία του Α και Β και να δεις ποιος είναι μεγαλύτερος. -Αν ο Α τότε όλα οκ. -Αν ο Β τότε με ένα if μέσα στο for υπολογισμού του αποτελέσματος κάνεις το A-B π.χ B-A και φυσικά στο τελευταίο ψηφίο που υπολογίζεις (βγαίνοντας από την for) βάζεις το αντίθετο του.(αν το μηδέν τότε το προτελευταίο ψηφίο) π.χ. 3----> -3 είναι αρκετά απλο νομίζω. δοκίμασε το και αν κολλήσεις πες να στείλω περισσότερες οδηγίες
GREGKERKYRA Δημοσ. 25 Φεβρουαρίου 2010 Μέλος Δημοσ. 25 Φεβρουαρίου 2010 για την αφαίρεση μπορείς με μία for να διατρέξεις τα στοιχεία του Α και Β και να δεις ποιος είναι μεγαλύτερος. -Αν ο Α τότε όλα οκ. -Αν ο Β τότε με ένα if μέσα στο for υπολογισμού του αποτελέσματος κάνεις το A-B π.χ B-A και φυσικά στο τελευταίο ψηφίο που υπολογίζεις (βγαίνοντας από την for) βάζεις το αντίθετο του.(αν το μηδέν τότε το προτελευταίο ψηφίο) π.χ. 3----> -3 είναι αρκετά απλο νομίζω. δοκίμασε το και αν κολλήσεις πες να στείλω περισσότερες οδηγίες Ναι το εκανα ηταν πολυ απλο τελικά, το εκανα με μια αναποδη for και συγκρινα τα ψηφια των πινακων για να βρω τον μεγαλήτερο αριθμό, και μετα ακριβώς όπως τα είπες! νασαι καλα.
Thodoris22 Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Ναι το εκανα ηταν πολυ απλο τελικά, το εκανα με μια αναποδη for και συγκρινα τα ψηφια των πινακων για να βρω τον μεγαλήτερο αριθμό, και μετα ακριβώς όπως τα είπες! νασαι καλα. Μήπως μπορείς και να το ανεβάσεις GREGKERKYRA αν σου είναι εύκολο;
JimGer Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Για τον πολ/σμο δεν βλέπω να μίλησε κανένας οπότε θα πω τι θα έκανα εγώ. carry=0; for (i=1;i<=100;i++) { C=((A*B) + carry) mod 10 ; carry=(A*B) div 10; } λογικά σαν σκέψη δουλεύει τώρα δεν ξέρω αν περνάει c compiler τώρα το έγραψα στο forum αλλά καταλαβαίνετε την λογική....
Thodoris22 Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Για τον πολ/σμο δεν βλέπω να μίλησε κανένας οπότε θα πω τι θα έκανα εγώ.carry=0; for (i=1;i<=100;i++) { C=((A*B) + carry) mod 10 ; carry=(A*B) div 10; } λογικά σαν σκέψη δουλεύει τώρα δεν ξέρω αν περνάει c compiler τώρα το έγραψα στο forum αλλά καταλαβαίνετε την λογική.... Νομίζω φίλε μου ότι πρέπει να βάλεις δύο for καθώς πρέπει να πολλαπλασιαστούν όλα τα στοιχεία του Α με όλα του Β όπως στον πολλαπλασιασμό όλα του πρώτου όρου με όλα του δεύτερου...χωρίς να είμαι σίγουρος βέβαια.
JimGer Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 ναι ναι έχεις δίκιο γράψε άκυρο ξέχασα πως κάνουμε πολλαπλασιασμό μέχρι τι μέγεθος δικαιούμαστε για τον C? γιατί λογικά θέλω έναν 101χ200????λόγω 100 προσθέσης μερικών γινομένων και μία για το αποτέλεσμα και max 200 νούμερα το αποτέλεσμα....
Thodoris22 Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Πολλαπλασιασμο κανεις? Και γω δεν μπορώ να βρω λύση στον πολ/σμο αν δεν υπάρξει και ένας ακόμη βοηθητικός πίνακας, αλλά μπορεί και να μας δίνει κάποιον, στο κάτω κάτω η εκφώνηση δεν θα ναι η ίδια.
Melkor66 Δημοσ. 25 Φεβρουαρίου 2010 Δημοσ. 25 Φεβρουαρίου 2010 Σωστα είχα βρει μια λύση αλλα έχει προβλημα στην αποθηκευση στον C και επισης είναι πολύ ασχημη "προγραμματιστικά". ας πουμε 436 *28 3488 872 12208 αποθηκεθει το 3488 στον C και μετα προσθετει το 872 αυτη ειναι η λογική αλλα 1)με τα for δεν γινεται καλα η αποθηκευση και στην ουσια προσθετουμε το 3488 με το 872*10 Ερωτηση μπορεί κανεις να δειξει αφαιρεση στην περιπτωση του Β>Α Δεν βρίσκω πως να συνδυασω την απλη αφαιρεση για Α>Β στο ιδιο προγραμμα με την περιπτωση Β>Α.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.