mod και αρνητικοι αριθμοι..

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

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

Απάντηση
greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 09 Οκτ 2010 18:16

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

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

#include <stdio.h>
main&#40;&#41;
&#123;
	int ar, sum, i;
	printf&#40;"doste arithmo"&#41;;
	scanf&#40;"%d", &ar&#41;;
	sum=1;
	for&#40;i=1;i<ar;++i&#41;
	&#123;	sum=sum*i;
		printf&#40;"%d\t%d\n", i, sum&#41;;
	&#125;
	if &#40;sum % ar == &#40;-1&#41; % ar&#41;
		printf&#40;"protos"&#41;;
	else
		printf&#40;"oxi protos"&#41;;
&#125;
στο προγραμμα αυτο χρησιμοποιο το -1 mod αριθμος.. οποιοσδηποτε και να ειναι ο αριθμος δινει αποτελεσμα -1 που ειναι λαθος.. για παραδειγμα -1 mod 7 ειναι ισο με 6.. τι μπορω να κανω ωστε να "δουλευει" ο mod με αρνητικους..?

ευχαριστω.[/code]

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

mod και αρνητικοι αριθμοι..

Δημοσίευση από cordis » 09 Οκτ 2010 18:27

βάλτου και μια abs εκεί...

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

if &#40;sum % ar == &#40;abs&#40;-1&#41;&#41; % ar&#41; 
http://www.cplusplus.com/reference/clib ... tdlib/abs/
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 09 Οκτ 2010 18:36

cordis έγραψε:βάλτου και μια abs εκεί...

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

if &#40;sum % ar == &#40;abs&#40;-1&#41;&#41; % ar&#41; 
http://www.cplusplus.com/reference/clib ... tdlib/abs/
τωρα οτι και να βαλω βγαζει απαντηση 1 αντι για -1 που εβγαλε πριν.. :-?

Άβαταρ μέλους
jjim50
Δημοσιεύσεις: 48
Εγγραφή: 02 Φεβ 2009 15:37
Τοποθεσία: Ηράκλειο
Επικοινωνία:

mod και αρνητικοι αριθμοι..

Δημοσίευση από jjim50 » 09 Οκτ 2010 23:04

http://primes.utm.edu/notes/faq/negative_primes.html
Αν ισχύει το παραπάνω τότε πρέπει να γράψεις κάτι σαν:

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

   printf&#40;"doste arithmo"&#41;;
   scanf&#40;"%d", &ar&#41;;
   ar = abs&#40;ar&#41;;
www.cobaltblue.gr - Φιλικό hosting, πρωτότυπη εξυπηρέτηση.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

mod και αρνητικοι αριθμοι..

Δημοσίευση από virxen75 » 10 Οκτ 2010 02:25

και το calculator των windows -1 δίνει το αποτέλεσμα

-1 mod 7

to 6 που λες εσύ πως προκύπτει?

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

mod και αρνητικοι αριθμοι..

Δημοσίευση από dva_dev » 10 Οκτ 2010 07:32

Από το excel (Πηλίκο = -1, υπόλοιπο = 6)

greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 10 Οκτ 2010 19:07

ναι οντως και το calculator λαθος το βγαζει :-? αλλα το google, το excel και το mathematica βγαζουν το σωστο.. τι να πω.. αν καποιος ξερει τι παιζει....

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

mod και αρνητικοι αριθμοι..

Δημοσίευση από dva_dev » 10 Οκτ 2010 19:49

Αν από τον ορισμό της διαίρεσης πρέπει το υπόλοιπο να έχει το ίδιο πρόσημο με τον διαιρέτη, τότε μάλλον σωστό είναι το excel. Αν δεν υπάρχει τέτοιος περιορισμός τότε σωστό είναι το calculator.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

mod και αρνητικοι αριθμοι..

Δημοσίευση από nbc » 10 Οκτ 2010 20:27

To -1 αν διαιρεθεί με το 7, προκύπτει

-0,14285714285714285714285714285714

Για να βρεθεί το modulo, θα πρέπει αυτό το νούμερο (πηλίκο) να μετατραπεί σε ακέραιο, με βάση και με τον τύπο του Excel (όπως αναγράφεται στο link που δόθηκε)

MOD(n, d) = n - d*INT(n/d)

Το παιχνίδι παίζεται στην INT και πως υλοποιείται σε κάθε βιβλιοθήκη. Άλλη κάνει truncate (το σωστό, πιστεύω) και άλλη round down. Truncate σημαίνει πετάμε τα δεκαδικά και κρατούμε τον ακέραιο - στην περίπτωσή μας το -0. Round down σημαίνει ότι βρίσκουμε τον αμέσως μικρότερο ακέραιο - στην περίπτωσή μας το -1. Όμως, γι αυτήν τη δουλειά υπάρχει η floor() και δεν θα έπρεπε να λειτουργεί όπως η int(). Το πρόβλημα προκύπτει από το γεγονός ότι στους θετικούς (πραγματικούς) αριθμούς η int() και η floor() έχουν το ίδιο αποτέλεσμα - μόνο το data type αλλάζει. Στους αρνητικούς, όμως, έχουν διαφορετικό αποτέλεσμα, εξ ου και το puzzle.

H PHP (όπως και η C), δίνει -1%7=-1 γιατί το casting του ανωτέρω πηλίκου σε int επιστρέφει 0 (σωστό, κατά τη γνώμη μου) ενώ η floor() επιστρέφει -1.

Ένα άλλο σκεπτικό που με κάνει να υποστηρίζω το -1 ως ορθό αποτέλεσμα είναι ότι για να έχουμε n%7=6 θα πρέπει το n να ισούται με x*6+(x-1), όπου x θετικός ακέραιος. Τη λογική του Excel ότι πρέπει το αποτέλεσμα να έχει το ίδιο πρόσημο με τον διαιρέτη δεν μπορώ να την κατανοήσω.

Από την άλλη, δεν είμαι Μαθηματικός οπότε μπορεί να λέω και ανακρίβειες.

greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 10 Οκτ 2010 21:25

στο προγραμμα χρησιμοποιω τον τυπο που εχει και στην wikipedia για το αν ενας αριθμος ειναι πρωτος η οχι.. συμφωνα με το αρθρο το το υπολοιπο της διαιρεσης του Ν-1 παραγοντικο με το Ν θα πρεπει να ειναι ισο με το υπολοιπο της διαιρεσης του -1 με το Ν.. αν συμβαινει αυτο τοτε ο αριθμος ειναι πρωτος.. αλλα για να δουλεψει ολο αυτο πρεπει με καποιο τροπο να κανω το προγραμμα να δινει το ιδιο αποτελεσμα που δινει το excel, το google και το mathematica.. οπου στα τρια παραπανω οποιο αριθμο και να δοκιμασα με την παραπανω λογικη μου βγηκαν σωστα τα αποτελεσματα.. το εψαξα αρκετα ακομα δεν εχω καταληξη καπου και αρχισω να πιστευω οτι ισως να μην υλοποιειται αυτο στην C..

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

mod και αρνητικοι αριθμοι..

Δημοσίευση από nbc » 10 Οκτ 2010 21:42

Αν το πρόβλημά σου είναι ότι το modulus division δεν συμπεριφέρεται όπως θέλεις, τότε φτιάξε τη δική σου συνάρτηση, σύμφωνα με τον τύπο παραπάνω, και αντικατέστησε το int με το floor. Όπου έχεις x%y, το αντικαθιστάς με mod(x,y). Για να μη σου πω ότι σε C++ μπορείς να κάνεις overloading στον ίδιο operator.

Το να λες ότι ο αλγόριθμος δεν υλοποιείται σε C, ε, είναι υπερβολή.

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

mod και αρνητικοι αριθμοι..

Δημοσίευση από virxen75 » 10 Οκτ 2010 21:45

κάτι τέτοιο βοηθάει?

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

#include <stdio.h>
int mod&#40;int ,int&#41;;
int main&#40;&#41;
&#123;
printf&#40;"\n -1 mod 7=%d",mod&#40;-1,7&#41;&#41;;
printf&#40;"\n 10 mod 3=%d",mod&#40;10,3&#41;&#41;;
getchar&#40;&#41;;
      return 0;
&#125; 

int mod&#40;int x, int m&#41; &#123;
    int r = x%m;
    return r<0 ? r+m &#58; r;
&#125;

greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 10 Οκτ 2010 22:12

nbc έγραψε:Αν το πρόβλημά σου είναι ότι το modulus division δεν συμπεριφέρεται όπως θέλεις, τότε φτιάξε τη δική σου συνάρτηση, σύμφωνα με τον τύπο παραπάνω, και αντικατέστησε το int με το floor. Όπου έχεις x%y, το αντικαθιστάς με mod(x,y). Για να μη σου πω ότι σε C++ μπορείς να κάνεις overloading στον ίδιο operator.

Το να λες ότι ο αλγόριθμος δεν υλοποιείται σε C, ε, είναι υπερβολή.
χεχε οντως υπερεβαλα εννοουσα οτι δεν γινοταν απευθειας.. φιλε virxen75 θενκιου για τον κοπο σου λογικα αυτο μου κανει καθομαι τωρα να κοιταξω και να κανω τις καταληλες τροποποιησεις να το φερω στα μετρα μου.. σας ευχαριστω ολους αν χρειαστω κατι θα ξαναποσταρω!

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

mod και αρνητικοι αριθμοι..

Δημοσίευση από dva_dev » 10 Οκτ 2010 22:17

Καλύτερα έτσι

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

int mod&#40;int x, int m&#41;
&#123;
    int r = x%m;
    return &#40;r*m < 0&#41; ? r+m &#58; r;
&#125;
ή

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

int mod&#40;int x, int m&#41;
&#123;
    int r = x%m;
    return &#40;sign&#40;r&#41;!=sign&#40;m&#41;&#41; ? r+m &#58; r;

&#125;

greel
Δημοσιεύσεις: 8
Εγγραφή: 09 Οκτ 2010 18:04

mod και αρνητικοι αριθμοι..

Δημοσίευση από greel » 10 Οκτ 2010 22:47

dva_dev έγραψε:Καλύτερα έτσι

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

int mod&#40;int x, int m&#41;
&#123;
    int r = x%m;
    return &#40;r*m < 0&#41; ? r+m &#58; r;
&#125;
ή

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

int mod&#40;int x, int m&#41;
&#123;
    int r = x%m;
    return &#40;sign&#40;r&#41;!=sign&#40;m&#41;&#41; ? r+m &#58; r;

&#125;

χμμ οντως δουλευει ετσι.. παρολαυτα απο το 17 και μετα δεν τα εμφανιζει σωστα αλλα πιστευω οτι ειναι λογο του τυπου της μεταβλητης επειδη απο ενα σημειο και μετα το ν-1 παραγοντικο γινεται υπερβολικα μεγαλο.. θα το κοιταξω και αυτο.. οπως και να χει σε ευχαριστω πολυ για τον χρονο σου

Απάντηση

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

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

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