[Solved] - Περιττοί και άρτιοι αριθμοί

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

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

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

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από Connor MacLeod » 14 Νοέμ 2011 19:05

Καταρχήν ξερω ότι ειναι γελίο αυτο που ρωτάω, αλλα τώρα εχω ξεκινήσει να μαθαίνω C γιαυτο μη με παρεξηγείτε.

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

Για αρχη απο τα maths για να κανω κατι τετοιο, ειναι φανταζομαι με τον εξής τρόπο:
αν ο αριθμος ειναι 50, κανω 50/2 και αν το αποτέλεσμα ειναι ακέραιος ειναι ζυγός. αν όχι, ειναι μονος.

Παμε παρακατω.
Στη c καταρχιν ξερω ότι θα χρησιμοποιήσω if και else if για αν του πω αν αυτο που θα σε δωσω βγαλει ακεραιο πηλίκο γραψε οτι ειναι ζυγος, αλιως αν το πηλίκο εχει υπολοιπο δεν ειναι.

Το θεμα μου ειναι πως θα το πω στη C.
Σκέφτηκα
if (arithmos/2=%i) printf("zigos") ;
και
if (arithmos/2==%i) printf("zigos") ;

αλλα ειναι λαθος.
Πως θα του το δωσω να το καταλαβει?
:think:
Τελευταία επεξεργασία από το μέλος Connor MacLeod την 14 Νοέμ 2011 19:12, έχει επεξεργασθεί 2 φορές συνολικά.
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

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από katerinaaa » 14 Νοέμ 2011 19:08

Δοκίμασε να πάρεις το mod (υπόλοιπο) του αριθμού με το 2 αν είναι 0 τότε είναι ζυγος
αλλιώς είναι περιττός.

Έστω a αριθμός

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

if(a%2 == 0)
   printf("zigos");
else
  printf("monos");

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

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από Connor MacLeod » 14 Νοέμ 2011 19:12

Σωστή.
Thanks.
Τωρα τα εύκολα γιατι τα κανω δύσκολα ειναι αλλο θεμα.
: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)

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από nkast » 17 Νοέμ 2011 10:31

Και μια λύση με bitwase για να μην κάθεται η ταλαίπωρη CPU να κάνει διαιρέσεις...
(οταν βλέπω C με πιάνει optimization mood!)

isOdd = (arithmos & 1);

Εξήγηση:
Αν φανταστείς εναν αριθμό σε binary, το αν ειναι μονος/ζυγός εχει να κανει αποκλειστικά με το LSB (Least significant bit).
Το (arithmos AND 1) λειτουργεί σαν μασκα οπου καθαρίζουμε ολα τα bits πλην του τελευταίου.
Το αποτελεσμα λειτουργει σαν boolean. Στην C το 0 είναι false και ολα τα αλλα true.

...λειτουργεί ΚΑΙ με αρνητικούς.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από LightForce » 17 Νοέμ 2011 12:44

nkast έγραψε:...λειτουργεί ΚΑΙ με αρνητικούς.
Mια παρατήρηση,
Δεν είναι universal μέθοδος.
Λειτουργεί σε αρχιτεκτονική με συμπλήρωμα ως προς 2 αλλά όχι ως προς 1.

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από nkast » 17 Νοέμ 2011 17:29

Σωστος ο φιλος LightForce!

Δεν περιμενα να το πιάσει κάποιος.

Ποιος θα δωσει τη universal λύση;
(ενοήτε μονο με arichmetic και bitwise χωρις χρηση if. για να μην καθαρίσει και η prefetch queue)
;-)

Υ.Γ = Βεβαια δεν γνωριζω καποια CPU που να μην λειτουργεί με συμπλήρωμα-2.

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από gvre » 17 Νοέμ 2011 23:36

Ο gcc, λογικά και οι υπόλοιποι σύγχρονοι compilers, παράγει ακριβώς τον ίδιο assembly κώδικα και στις 2 περιπτώσεις ( (i % 2) και (i & 1) ), αν ενεργοποιηθούν τα optimizations.
Γνωρίζει κανένας τι γίνεται στις άλλες γλώσσες;

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από LightForce » 20 Νοέμ 2011 00:49

nkast έγραψε:Υ.Γ = Βεβαια δεν γνωριζω καποια CPU που να μην λειτουργεί με συμπλήρωμα-2.
Σύγχρονη CPU ναι, ούτε και εγώ, η παρατήρηση ήταν θεωρητική υπόθεση. :)

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

[Solved] - Περιττοί και άρτιοι αριθμοί

Δημοσίευση από nkast » 20 Νοέμ 2011 11:52

Ενδιαφέρουσα παρατήρηση πάντως..
Ο λόγος που το κόλπο δουλεύει και με αρνητικούς, είναι ακριβώς επειδή οι αρνητικοί παριστάνονται στους σύγχρονους υπολογιστές με συμπλήρωμα ως προς 2.

Αν ήταν διαφορετικά θα έπρεπε να λαβουμε υποψη και το MSB και να καναμε αλλου ιδους αλχημιες με τα bits.

Απο την αλλη οπως ειπε και ο gvre, οι compilers εχουν γινει πολυ καλοι τελευταια στο local optimization και ισως τελικα δεν χρειαζετε να εφαρμοζουμε τετοια κολπα που μειώνουν το readability.

Εκει που δεν μας εχουν ξεπερασει ακομα ειναι στο global optimization, δηλαδη να δουν εναν αλγοριθμο, να συμπερανουν τι προσπαθουμε να κανουμε και να τον ξαναγραψουν απο την αρχη!
Ενα τετοιο παραδειγμα ειναι η λύση που εδωσε ο dva_dev στο http://www.freestuff.gr/forums/viewtopic.php?t=59187
Ενας υπολογιστη δεν θα μπορουσε ποτε (?*) να κατανοήσει ενα προγραμα συνολικα και να προτείνει εναλλακτική λυση. Οσο και αν κανει optimize τοπικα εναν αργο αλγοριθμο θα παραμένει ενας γρηγορος-αργος αλγοριθμος.
Και το κέρδος που παίρνεις εφαρμοζοντας εναν πιο εξυπνο αλγοριθμο ειναι ταξεις μεγεθους, ενω απο τοπικο optimization είναι ποσοστιαίο.

*= ή μηπως οι συγγραφείς compilers είναι τεμπέληδες χωρίς όραμα;

Απάντηση

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

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

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