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

ANSI C / C++ : o megaliteros unsigned integer? (gia "for" looping)


Stilewag

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

Δημοσ.

Μπορείς να φτιάξεις μεγάλους integer με διάφορους τρόπους

 

Ένας πολύ απλός, αργός και σπάταλος σε μνήμη τρόπος:

 

#define DIGITS 500

typedef struct

{

char storage[DIGITS];

int length; //το μήκος του αριθμού σε ψηφία στο δεκαδικό

} teraint;

 

Κάθε θέση του storage είναι και ένα ψηφίο του αριθμού στο δεκαδικό σύστημα.

Μετά θα πρέπει να φτιάξεις συναρτήσεις για κάθε λειτουργία που χρειάζεσαι. Στην περίπτωση του loop χρειάζεσαι μια συνάρτηση σύγκρισης ( int compare( teraint a, teraint B) ) και μια συνάρτηση αύξησης ( void inc( teraint a ) ) της οποίες πρέπει να γράψεις ο ίδιος.

 

Σε C++ μπορείς να γράψεις μια κλάση και κάνοντας χρήση operator overloading να φτιάξεις ένα δικό σου τύπο με συμπεριφορά παρόμοια με τους κανονικούς int.

 

Ωστόσο πιστεύω ότι θα υπάρχει και ποιο εύκολος τρόπος να κάνεις αυτό που θέλεις - π.χ. να χρησιμοποιήσεις nested loops όπως σου πρότεινε ο godlike

Δημοσ.

"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 :D

 

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?

Δημοσ.
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

Δημοσ.

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

Δημοσ.

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 "%"?

Δημοσ.

Δε νομίζω ότι χρειάζεσαι μεγάλους αριθμούς. Πάρε ένα 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;
}

Δημοσ.

Καταρχήν προσπάθησε να μπεις στην δεκαεξαδική λογική. Δηλ. μην γράφεις τους αριθμούς στο 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.

Δημοσ.

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?

Δημοσ.

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)

Δημοσ.

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

 

Για να τυπώσεις τον αριθμό που βρήκες με το πρόγραμμα του EPa πρέπει απλά να κάνεις

printf("%s", word)

αφού ο αριθμός καταχωρείται σαν σειρά από χαρακτήρες (string)...

 

Επίσης αν θυμάμαι καλά η BorlandC 2.0 έχει τα ΜΙΣΑ μεγέθη απ' ότι οι σύγχρονοι compilers, δηλαδή int = 16 bit και όχι 32 bit. Δεν είμαι όμως 100% σίγουρος.

 

Edit: γιατί δεν γράφεις αναλυτικά το πρόβλημα και το σκεπτικό σου για την λύση του; Αν π.χ. θέλεις απλά να γεννήσεις μια τυχαία λέξη (σαν brute force password), αρκεί να κάνεις 50 random, όσες και το μέγεθος της λέξης σου, και έτσι θα βγει ένα string του στυλ

"alsjdflianorewigqnoiewrhgoqiwejrqowkehjrofqihwegouqre"

 

Εξήγησέ μας καλύτερα ποιος είναι ο απώτερος σκοπός για να σε βοηθήσουμε.

Δημοσ.

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);

}

Δημοσ.

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 ?

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

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

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