porosis Δημοσ. 1 Απριλίου 2005 Δημοσ. 1 Απριλίου 2005 Μπορείς να φτιάξεις μεγάλους integer με διάφορους τρόπους Ένας πολύ απλός, αργός και σπάταλος σε μνήμη τρόπος: #define DIGITS 500 typedef struct { char storage[DIGITS]; int length; //το μήκος του αριθμού σε ψηφία στο δεκαδικό } teraint; Κάθε θέση του storage είναι και ένα ψηφίο του αριθμού στο δεκαδικό σύστημα. Μετά θα πρέπει να φτιάξεις συναρτήσεις για κάθε λειτουργία που χρειάζεσαι. Στην περίπτωση του loop χρειάζεσαι μια συνάρτηση σύγκρισης ( int compare( teraint a, teraint ) και μια συνάρτηση αύξησης ( void inc( teraint a ) ) της οποίες πρέπει να γράψεις ο ίδιος. Σε C++ μπορείς να γράψεις μια κλάση και κάνοντας χρήση operator overloading να φτιάξεις ένα δικό σου τύπο με συμπεριφορά παρόμοια με τους κανονικούς int. Ωστόσο πιστεύω ότι θα υπάρχει και ποιο εύκολος τρόπος να κάνεις αυτό που θέλεις - π.χ. να χρησιμοποιήσεις nested loops όπως σου πρότεινε ο godlike
Stilewag Δημοσ. 2 Απριλίου 2005 Μέλος Δημοσ. 2 Απριλίου 2005 "Gray supercomputer"? -- mipws exoun kamia sxesi me tous Cray? "classes"? -- afto to exw ipopsin mou alla den exw idea ti prosferei i pws doulevei mmm... prepei na epispefsw ekeino to vivlio gia tin C, mallon gia tin C++... Pantws exw diavasei se ena arthro (trexa gireve) pws me to typedef ftiaxneis kainouriou typou metavlites, alla den tolmisa na to prospathisw... edw mou leipoun ta vasika! LOL Alla aplws san odigo sto ti prepei telika na mathw gia na ftasw se afto to simeio: mporw na valw pragmatika enan integer me 500 psifia? I me osa thelw px 4000 psifia? (entaksi toto poli den mou xreiazetai, apla thelw na kserw ta oria me ton tropo tou typedef) Poso mnimi tha mou "faei"? 1MB? 10MB?
Stilewag Δημοσ. 2 Απριλίου 2005 Μέλος Δημοσ. 2 Απριλίου 2005 PS: to noumero ton loops pou zitas einai pantos eksopragmatiko To xreiazomai gia na mporesw na paw se enan sindiasmo (apo enan arithmo 96^50 pithanous sindiasmous). Makari na min xreiazotane. Se proti fasi mou xreiazetai 96^9 < 2^63. Gia na exw enan arithmo 2^63 megalo, pws ton orizw? Me unsigned long? Kai epeita, me ti %?? kanw scanf kai printf? To scanf("%li", num1) kai to printf("%li', num1) mou kovoun psifia. PS: mporesa na ipologisw ta 96^9 = 692533995824480256 2^63 = 9223372036854775808 apo edw: http://www.swox.com/gmp/#TRY
hayzel Δημοσ. 2 Απριλίου 2005 Δημοσ. 2 Απριλίου 2005 stin c++ mporeis na dwseis: unsigned long long int w1; to megethos tou w1 einai 8bytes = 64bits . opote tha mporeseis na kaneis to loop... kai na xrisimopoihseis ta scanf, printf.... Apla to programma tha trexei polli pio arga se 32bit epeksergasth apo oti 64bit cpu...
Stilewag Δημοσ. 2 Απριλίου 2005 Μέλος Δημοσ. 2 Απριλίου 2005 o compiler pou xrisimopoiw mou vgazei lathos me to "long long int", alla me "long long" einai ok afto pou den exw vrei einai ti % na xirimopoiisw %d ...oxi, einai poli mikro %li ... einai megalo alla oxi arketa ti vazw dipla sto "%"?
EPa Δημοσ. 2 Απριλίου 2005 Δημοσ. 2 Απριλίου 2005 Δε νομίζω ότι χρειάζεσαι μεγάλους αριθμούς. Πάρε ένα C το οποίο σου τυπώνει όλους τους συνδιασμούς. Υποθέτει ότι το αλφάβητό σου είναι συνεχόμενο και από τους ASCII χαρακτήρες. Αν δεν είναι έτσι, μπορείς να κάνεις μερικές αλλαγές (να το ορίσεις σε πίνακα, κλπ.). Παίξε με τις τιμές στα #define, και πες μου αν είναι αυτό που ήθελες: > #include <stdio.h> #define WORD_LENGTH 3 #define ALPHABET_LENGTH 3 #define ALPHABET_START 'a' char word[WORD_LENGTH + 1]; int main(void) { int i; for (i = 0; i < WORD_LENGTH; ++i) word[i] = ALPHABET_START; word[i] = 0; do { puts(word); i = WORD_LENGTH; do { word[--i]++; if (word[i] >= ALPHABET_START + ALPHABET_LENGTH) word[i] = ALPHABET_START; } while (word[i] == ALPHABET_START && i); } while (i || word[i] != ALPHABET_START); return 0; }
Stilewag Δημοσ. 2 Απριλίου 2005 Μέλος Δημοσ. 2 Απριλίου 2005 To koitaw twra. An einai dinaton min vazeis to dioti exw (gia tin wra Opera 6.0) kai mou to vgazei ena matso apo xaraktires, opote prepei meta na to ksanagrafo
godlike Δημοσ. 3 Απριλίου 2005 Δημοσ. 3 Απριλίου 2005 Καταρχήν προσπάθησε να μπεις στην δεκαεξαδική λογική. Δηλ. μην γράφεις τους αριθμούς στο 10δικό αλλά στο 16δικό σύστημα για να διευκολύνεσαι καλύτερα. Είναι δύσκολο στην αρχή αλλά άμα μάθεις θα είναι καλύτερα. Επειδή κάπου σε έχασα. Αυτό που θες είναι σε πρώτη φάση να κάνεις ένα loop 2^63 = 0x8000.0000.0000.0000 (= 64bit). Αυτό μπορείς να το κάνεις χρησιμοποιώντας 2 for δηλ. for(int x=0; x==0xFFFFFFFF, x++) for(int y=0; y==0xFFFFFFFF, y++) /* code */ Με αυτόν τον τρόπο πετυχαίνεις 0xFFFFFFFF * 0xFFFFFFFF = 0xFFFF.FFFE.0000.0001 (= 64bit) loops πράγμα που είναι πιο πάνω απ’ αυτό που ζητάς. Η Visual C++ ορίζει τον τύπο int σαν 32bit. Εκτός από αυτόν τον τύπο υπάρχουν και άλλοι στην VC++, όπως ο long double ο οποίος είναι 10Bytes=80bits ή ο double που είναι 64bits. Αν θες 128bit τύπο πρέπει να χρησιμοποιήσεις SSE για τους 128bit registers (τους XMM) πράγμα που όπως είπα είναι αρκετά δύσκολο μιας και θα πρέπει να γράψεις σε Assembly.
Stilewag Δημοσ. 3 Απριλίου 2005 Μέλος Δημοσ. 3 Απριλίου 2005 tha me diefkoline "for" na einai 1 anti gia 2 kai na parameinw sto 2^63. Ginetai? pws tha grapsw to printf gia na tiposw stin othoni ton 0xFFFFFFFF kai ton 0x8000.0000.0000.0000?
Stilewag Δημοσ. 6 Απριλίου 2005 Μέλος Δημοσ. 6 Απριλίου 2005 EPa, to progamma doulevei teleia. Akoma prospathw na katalavw tin logiki tou (eipame eimai protaris ston progammatismo kai stin C). Otan kataferw kai to katanoisw plirws, tha to alaksw etsi wste to alfavito na exei 96 xaraktires kai i leksi na exei 9 grammata. Tha xreiastw na kataxwrw kai na ektiponw stin othini enan arithmo megethous 96^9. Tha me diefkoline an kapoios mou elege kai pws na ektipwsw stin othoni enan toso megalo arithmo. To: printf("%li", BigNumber); mou kwvei arketa psifia. (to idio akrivws rotisa sto parapanw post, prin apo merikes meres)
alkisg Δημοσ. 6 Απριλίου 2005 Δημοσ. 6 Απριλίου 2005 Αυτό που σου είπε ο EPa δεν μπορεί να σου βρει αμέσως έναν "τυχαίο" συνδυασμό, αλλά δουλεύει με την λογική που είχες προτείνει κι εσύ στην αρχή, δηλαδή μετρώντας όλους τους συνδυασμούς με τη σειρά. Για να τυπώσεις τον αριθμό που βρήκες με το πρόγραμμα του EPa πρέπει απλά να κάνεις printf("%s", word) αφού ο αριθμός καταχωρείται σαν σειρά από χαρακτήρες (string)... Επίσης αν θυμάμαι καλά η BorlandC 2.0 έχει τα ΜΙΣΑ μεγέθη απ' ότι οι σύγχρονοι compilers, δηλαδή int = 16 bit και όχι 32 bit. Δεν είμαι όμως 100% σίγουρος. Edit: γιατί δεν γράφεις αναλυτικά το πρόβλημα και το σκεπτικό σου για την λύση του; Αν π.χ. θέλεις απλά να γεννήσεις μια τυχαία λέξη (σαν brute force password), αρκεί να κάνεις 50 random, όσες και το μέγεθος της λέξης σου, και έτσι θα βγει ένα string του στυλ "alsjdflianorewigqnoiewrhgoqiwejrqowkehjrofqihwegouqre" Εξήγησέ μας καλύτερα ποιος είναι ο απώτερος σκοπός για να σε βοηθήσουμε.
Stilewag Δημοσ. 6 Απριλίου 2005 Μέλος Δημοσ. 6 Απριλίου 2005 Ok. Mono pou etsi vasika programatizete eseis kai oxi egw Alla mallon den ginetai alliws To provlima mou einai to ekseis: Exw ena alfavito pou apoteleitai apo 96 xaraktires. O xristis tha ginei enan arithmo sto diastima 1 - 96^9, kai to programma tha tou leei poia leksei antistoixei se aftin tin leksi/sindiasmo. Psaxnw ton pio grigoro tropo gia na to kanw afto. To provlima einai pws o to programa prepei na einai se thesi na kataxwrisei kapou ston aritho pou tha dwsei o xristis. p.x., ti prepei na alaksw sto parakatw programma gia na doulepsei swsta? #include <stdio.h> #include <math.h> void main(void) { unsigned long long x; x = pow(96, 9); printf("\n\n\n%li", x); }
Stilewag Δημοσ. 6 Απριλίου 2005 Μέλος Δημοσ. 6 Απριλίου 2005 Vrika afto: http://www.dinkumware.com/htm_cl/limits.html Mporw na exw enan unsigned long long o opoios einai 18,446,744,073,709,551,616 (me xrisi tis vivliothikis limits.h ... alla prepei o compiler pou xrisimopoiw na ipakouei sto protypo C99. Pou simainei oti.. atyxisa I Turbo C++ pou xrisimipoiw einai tou 1992). Kserete kapoio compiler gia DOS (oxi Win32) pou na exei olokriromeno perivalon opws i Borland Turbo C++ 2.0 ?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.