Προς το περιεχόμενο

Δομες, αφαίρεση/πολλ/σμός μονοδιαστατων πινάκων


GREGKERKYRA

Προτεινόμενες αναρτήσεις

Δημοσ.

Μας δώθηκε το παρακάτω ερώτημα:

 

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++.

Δημοσ.

Ελα ρε ΤΕΙ Αθηνας......

Λοιπον το μαθημα το χω περασει σε προηγουμενη εξεταστικη που τα θεματα δεν ειχαν καμια σχεση με αυτα(ηταν πιο δυσκολα).Θα σου δωσω μια κατευθυνση για το πως να σκεφτεις.

Ολες οι πραξεις αναγονται σε μια.Την προσθεση.Επομενως για το πολλαπλασιασμο θα σκεφτεις ως εξης.Εφοσον εχεις ετοιμο τον κωδικα της προσθεσης, θα τον χρησιμοποιησεις για να κανεις και τον πολλαπλασιασμο.

Τι θα πει 3 φορες το 12?θα πει 12+12+12.Επομενως θα εχεις ενα βοηθητικο πινακα που θα κραταει τα αποτελεσματα τον προσθεσεων.Αρα μια επαναληπτικη διαδικασια που θα εκτελει την προσθεση,οπως ακριβως την δειχνει ο Κοιλιας(ο καθηγητης), για οσες φορες πρεπει.Αν σκεφτεις ετσι θα φτασεις γρηγορα στη λυση

 

Οσο αφορα την αφαιρεση σκεψου το εξης.Αν Α(ι) < Β(ι) τοτε πρεπει να προσθεσεις 10 στο Α(ι) και να κανεις το carry=1 και μετα το κρατουμενο να το προσθεσεις στο Β(ι) της επομενης επαναληψης.Οπως ακριβως θα εκανες και αν εκανες την πραξη με το χερι..

 

Σαν παλιοτερος που ειμαι ας μου επιτραπει ενα σχολιο.Περαστε τωρα που βαζει ευκολα.Το πρωτο θεμα ειναι επιπεδου τριτης λυκειου και πιανει 5.Αν δινατε τα προηγουμενα εξαμηνα θα βλεπατε οτι τα θεματα που ηθελαν αμεσα και σειριακα αρχεια επιαναν 7 μοναδες.Τωρα με πινακες πας στο 5.

Δημοσ.

ΑΦΑΙΡΕΣΗ

=================

 

 

>
#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;    
}

 

Δημοσ.

Την αφαίρεση την κατάφερα και εγώ μοιάζει αρκετά με το δικό σου, αλλά απο ότι βλέπω δουλεύει σωστά μόνο αν ο αριθμός στο Α() είναι μεγαλύτερος απο τον αριθμό στο Β(), εννοώ ολόκληρο των αριθμό οχι ένα στοιχείο. Αλλιώς θα επρεπε να βγάζει αρνητικό αποτέλεσμα, τώρα δν ξέρω αν θα ζητήσει κάτι τόσο τραβηγμένο. Εκτος αν αλλάξει κ η εκφώνηση και ζητάει πχ στην πρώτη θέση του πίνακα να μπαίνει κ το πρόσημο.

Σε ευχαρηστω!

 

---------- Προσθήκη στις 14:45 ---------- Προηγούμενο μήνυμα στις 13:34 ----------

 

Ελα ρε ΤΕΙ Αθηνας......

Λοιπον το μαθημα το χω περασει σε προηγουμενη εξεταστικη που τα θεματα δεν ειχαν καμια σχεση με αυτα(ηταν πιο δυσκολα).Θα σου δωσω μια κατευθυνση για το πως να σκεφτεις.

Ολες οι πραξεις αναγονται σε μια.Την προσθεση.Επομενως για το πολλαπλασιασμο θα σκεφτεις ως εξης.Εφοσον εχεις ετοιμο τον κωδικα της προσθεσης, θα τον χρησιμοποιησεις για να κανεις και τον πολλαπλασιασμο.

Τι θα πει 3 φορες το 12?θα πει 12+12+12.Επομενως θα εχεις ενα βοηθητικο πινακα που θα κραταει τα αποτελεσματα τον προσθεσεων.Αρα μια επαναληπτικη διαδικασια που θα εκτελει την προσθεση,οπως ακριβως την δειχνει ο Κοιλιας(ο καθηγητης), για οσες φορες πρεπει.Αν σκεφτεις ετσι θα φτασεις γρηγορα στη λυση

 

Οσο αφορα την αφαιρεση σκεψου το εξης.Αν Α(ι) < Β(ι) τοτε πρεπει να προσθεσεις 10 στο Α(ι) και να κανεις το carry=1 και μετα το κρατουμενο να το προσθεσεις στο Β(ι) της επομενης επαναληψης.Οπως ακριβως θα εκανες και αν εκανες την πραξη με το χερι..

 

Σαν παλιοτερος που ειμαι ας μου επιτραπει ενα σχολιο.Περαστε τωρα που βαζει ευκολα.Το πρωτο θεμα ειναι επιπεδου τριτης λυκειου και πιανει 5.Αν δινατε τα προηγουμενα εξαμηνα θα βλεπατε οτι τα θεματα που ηθελαν αμεσα και σειριακα αρχεια επιαναν 7 μοναδες.Τωρα με πινακες πας στο 5.

 

Αυτό προσπαθώ να κάνω με τον πολλαπλασιασμό, πολλαπλές προσθέσεις οσες είναι ο δέυτερος αριθμός, απλά δν ξέρω αν είναι βέλτιστη λύση(πολλές επαναλήψεις)

Ασε τραβάω τα μαλιά μου που δεν πήγα πρώτη εξεταστική , πέρναγες και τουρίστας α πήγαινες...:X

Δημοσ.

για την αφαίρεση

 

μπορείς με μία for να διατρέξεις τα στοιχεία του Α και Β και να δεις

ποιος είναι μεγαλύτερος.

 

-Αν ο Α τότε όλα οκ.

-Αν ο Β τότε

με ένα if μέσα στο for υπολογισμού του αποτελέσματος

κάνεις το A-B π.χ B-A

και φυσικά στο τελευταίο ψηφίο που υπολογίζεις (βγαίνοντας από την for)

βάζεις το αντίθετο του.(αν το μηδέν τότε το προτελευταίο ψηφίο)

π.χ. 3----> -3

 

είναι αρκετά απλο νομίζω.

δοκίμασε το και αν κολλήσεις πες να στείλω περισσότερες οδηγίες

Δημοσ.
για την αφαίρεση

 

μπορείς με μία for να διατρέξεις τα στοιχεία του Α και Β και να δεις

ποιος είναι μεγαλύτερος.

 

-Αν ο Α τότε όλα οκ.

-Αν ο Β τότε

με ένα if μέσα στο for υπολογισμού του αποτελέσματος

κάνεις το A-B π.χ B-A

και φυσικά στο τελευταίο ψηφίο που υπολογίζεις (βγαίνοντας από την for)

βάζεις το αντίθετο του.(αν το μηδέν τότε το προτελευταίο ψηφίο)

π.χ. 3----> -3

 

είναι αρκετά απλο νομίζω.

δοκίμασε το και αν κολλήσεις πες να στείλω περισσότερες οδηγίες

 

Ναι το εκανα ηταν πολυ απλο τελικά:-D, το εκανα με μια αναποδη for και συγκρινα τα ψηφια των πινακων για να βρω τον μεγαλήτερο αριθμό, και μετα ακριβώς όπως τα είπες!

νασαι καλα.

Δημοσ.
Ναι το εκανα ηταν πολυ απλο τελικά:-D, το εκανα με μια αναποδη for και συγκρινα τα ψηφια των πινακων για να βρω τον μεγαλήτερο αριθμό, και μετα ακριβώς όπως τα είπες!

νασαι καλα.

 

Μήπως μπορείς και να το ανεβάσεις GREGKERKYRA αν σου είναι εύκολο;

Δημοσ.

Για τον πολ/σμο δεν βλέπω να μίλησε κανένας οπότε θα πω τι θα έκανα εγώ.

carry=0;

for (i=1;i<=100;i++)

{

C=((A*B) + carry) mod 10 ;

carry=(A*B) div 10;

}

 

λογικά σαν σκέψη δουλεύει τώρα δεν ξέρω αν περνάει c compiler τώρα το έγραψα στο forum αλλά καταλαβαίνετε την λογική....

Δημοσ.
Για τον πολ/σμο δεν βλέπω να μίλησε κανένας οπότε θα πω τι θα έκανα εγώ.

carry=0;

for (i=1;i<=100;i++)

{

C=((A*B) + carry) mod 10 ;

carry=(A*B) div 10;

}

 

λογικά σαν σκέψη δουλεύει τώρα δεν ξέρω αν περνάει c compiler τώρα το έγραψα στο forum αλλά καταλαβαίνετε την λογική....

 

Νομίζω φίλε μου ότι πρέπει να βάλεις δύο for καθώς πρέπει να πολλαπλασιαστούν όλα τα στοιχεία του Α με όλα του Β όπως στον πολλαπλασιασμό όλα του πρώτου όρου με όλα του δεύτερου...χωρίς να είμαι σίγουρος βέβαια.

Δημοσ.

ναι ναι έχεις δίκιο γράψε άκυρο ξέχασα πως κάνουμε πολλαπλασιασμό:P

 

μέχρι τι μέγεθος δικαιούμαστε για τον C? γιατί λογικά θέλω έναν 101χ200????λόγω 100 προσθέσης μερικών γινομένων και μία για το αποτέλεσμα και max 200 νούμερα το αποτέλεσμα....

Δημοσ.
Πολλαπλασιασμο κανεις? :(

 

Και γω δεν μπορώ να βρω λύση στον πολ/σμο αν δεν υπάρξει και ένας ακόμη βοηθητικός πίνακας, αλλά μπορεί και να μας δίνει κάποιον, στο κάτω κάτω η εκφώνηση δεν θα ναι η ίδια.

Δημοσ.

Σωστα

είχα βρει μια λύση αλλα έχει προβλημα στην αποθηκευση στον C

και επισης είναι πολύ ασχημη "προγραμματιστικά".

 

ας πουμε

436

*28

3488

872

12208

 

αποθηκεθει το 3488 στον C και μετα προσθετει το 872

αυτη ειναι η λογική αλλα 1)με τα for δεν γινεται καλα η αποθηκευση

και στην ουσια προσθετουμε το 3488 με το 872*10

 

Ερωτηση μπορεί κανεις να δειξει αφαιρεση στην περιπτωση του Β>Α

Δεν βρίσκω πως να συνδυασω την απλη αφαιρεση για Α>Β στο ιδιο προγραμμα με την περιπτωση Β>Α.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...