begin process at 2012 05 27 19:27:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > SUITE LOGIQUE (PORTABLE)

SUITE LOGIQUE (PORTABLE)


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Niveau :Initié Date de création :03/11/2004 Date de mise à jour :03/11/2004 10:35:00 Vu :3 696

Auteur : aerith

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

le principe de la suite :
1
11
21
1211
111221
312211
...

la croissance du nombre generer etant exponentiel on se retrouve tres vite avec des nombre enorme, donc se programme suporte les grand nombres.
il utilise enormement de memoire malgrer un fonctionnement en base 4

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <time.h>
  • typedef struct _bit2
  • {
  • char B1:1;
  • char B2:1;
  • } bit2;
  • int Atol(const char *nbr)
  • {
  • unsigned int total = 0;
  • while (*nbr)
  • total = 10 * total + (*nbr++ - '0');
  • return total;
  • }
  • char GetBase4(bit2 Base4)
  • {
  • char Nbr = 0;
  • if(Base4.B1)
  • Nbr += 1;
  • if(Base4.B2)
  • Nbr += 2;
  • return Nbr;
  • }
  • bit2 SetBase4(char Nbr)
  • {
  • bit2 Base4;
  • Base4.B1 = 0;
  • Base4.B2 = 0;
  • if((Nbr == 1) || (Nbr == 3))
  • Base4.B1 = 1;
  • if((Nbr == 2) || (Nbr == 3))
  • Base4.B2 = 1;
  • return Base4;
  • }
  • int main(int argc, char* argv[])
  • {
  • FILE *Fichier;
  • unsigned int Iteration, Taille, i = 1;
  • bit2 *Buffer1, *Buffer2, *Cur1, *Cur2;
  • char Affiche = 0, Sauve = 0, Nbr, NbNbr;
  • clock_t Temp = clock();
  • if(argc >= 2)
  • {
  • if(strchr(argv[1], '-'))
  • {
  • if(strchr(argv[1], 'a'))
  • Affiche = 1;
  • if(strchr(argv[1], 's'))
  • Sauve = 1;
  • Iteration = Atol(argv[2]);
  • Taille = Atol(argv[3]);
  • }
  • else
  • {
  • Iteration = Atol(argv[1]);
  • Taille = Atol(argv[2]);
  • }
  • }
  • else
  • {
  • printf("\tCalcul d'une suite logique\n");
  • printf("\tPar aerith\tVersion 1.0\n\n");
  • printf("\tSyntax : %s -as <Iteration> <Buffer>\n", *argv);
  • printf("\t -a\t\t : Affiche le resulatat pendant le calcul\n");
  • printf("\t -s\t\t : Sauvegarde du resultat final dans suite.txt\n");
  • printf("\t <Iteration>\t : Nombre d'iteration dans la suite\n");
  • printf("\t <Buffer>\t : Taille du buffer stockant le nombre\n\n");
  • return 0;
  • }
  • Buffer1 = calloc(Taille/4, 1);
  • Buffer2 = calloc(Taille/4, 1);
  • if((!Buffer1) || (!Buffer2))
  • return 0;
  • *Buffer1 = SetBase4(1);
  • do
  • {
  • Cur1 = Buffer1;
  • Cur2 = Buffer2;
  • Nbr = GetBase4(*Cur1);
  • NbNbr = 1;
  • do
  • {
  • Cur1++;
  • if(GetBase4(*Cur1) == Nbr)
  • NbNbr++;
  • else
  • {
  • *Cur2++ = SetBase4(NbNbr);
  • *Cur2++ = SetBase4(Nbr);
  • if(Affiche)
  • printf("%i%i", NbNbr, Nbr);
  • Nbr = GetBase4(*Cur1);
  • NbNbr = 1;
  • }
  • }
  • while(GetBase4(*Cur1));
  • Cur1 = Buffer1;
  • Buffer1 = Buffer2;
  • Buffer2 = Cur1;
  • printf("\n%i \t : %i \t\t %i ms\n", i, strlen((char *)Buffer1)*4, clock() - Temp);
  • }
  • while(i++ < Iteration);
  • if(Sauve)
  • {
  • Fichier = fopen("suite.txt", "w");
  • fprintf(Fichier, "Iteration : %i\nTaille : %i\n", i-1, strlen((char *)Buffer1)*4);
  • Cur1 = Buffer1;
  • do
  • {
  • fprintf(Fichier, "%i", GetBase4(*(Cur1++)));
  • }
  • while(GetBase4(*Cur1));
  • fprintf(Fichier, "\nExecuter en %i ms\n", clock() - Temp);
  • fclose(Fichier);
  • }
  • free(Buffer1);
  • free(Buffer2);
  • return 1;
  • }
#include    <stdio.h>
#include	<stdlib.h>
#include    <time.h>

typedef struct _bit2
{
    char    B1:1;
    char    B2:1;
} bit2;

int   Atol(const char *nbr)
{
    unsigned int    total = 0;
    while (*nbr)
        total = 10 * total + (*nbr++ - '0');
    return total;
}

char   GetBase4(bit2 Base4)
{
    char    Nbr = 0;
    if(Base4.B1)
        Nbr += 1;
    if(Base4.B2)
        Nbr += 2;
    return Nbr;
}

bit2  SetBase4(char Nbr)
{
    bit2    Base4;
    Base4.B1 = 0;
    Base4.B2 = 0;
    if((Nbr == 1) || (Nbr == 3))
        Base4.B1 = 1;
    if((Nbr == 2) || (Nbr == 3))
        Base4.B2 = 1;
    return Base4;
}

int main(int argc, char* argv[])
{
	FILE			*Fichier;
	unsigned int	Iteration, Taille, i = 1;
    bit2            *Buffer1, *Buffer2, *Cur1, *Cur2;
    char            Affiche = 0, Sauve = 0, Nbr, NbNbr;
	clock_t			Temp = clock();

	if(argc >= 2)
	{
        if(strchr(argv[1], '-'))
        {
            if(strchr(argv[1], 'a'))
                Affiche = 1;
            if(strchr(argv[1], 's'))
                Sauve = 1;
    		Iteration = Atol(argv[2]);
	       	Taille = Atol(argv[3]);
        }
        else
        {
    		Iteration = Atol(argv[1]);
	       	Taille = Atol(argv[2]);
        }
	}
	else
	{
		printf("\tCalcul d'une suite logique\n");
		printf("\tPar aerith\tVersion 1.0\n\n");
		printf("\tSyntax : %s -as <Iteration> <Buffer>\n", *argv);
		printf("\t  -a\t\t : Affiche le resulatat pendant le calcul\n");
		printf("\t  -s\t\t : Sauvegarde du resultat final dans suite.txt\n");
		printf("\t  <Iteration>\t : Nombre d'iteration dans la suite\n");
		printf("\t  <Buffer>\t : Taille du buffer stockant le nombre\n\n");
		return 0;
	}
	
	Buffer1 = calloc(Taille/4, 1);
	Buffer2 = calloc(Taille/4, 1);
	if((!Buffer1) || (!Buffer2))
        return 0;
	*Buffer1 = SetBase4(1);

	do
	{
		Cur1 = Buffer1;
		Cur2 = Buffer2;
		Nbr = GetBase4(*Cur1);
		NbNbr = 1;
  		do
		{
            Cur1++;
            if(GetBase4(*Cur1) == Nbr)
                NbNbr++;
            else
            {
                *Cur2++ = SetBase4(NbNbr);
                *Cur2++ = SetBase4(Nbr);
                if(Affiche)
                    printf("%i%i", NbNbr, Nbr);
                Nbr = GetBase4(*Cur1);
                NbNbr = 1;
            }
		}
		while(GetBase4(*Cur1));

		Cur1 = Buffer1;
		Buffer1 = Buffer2;
		Buffer2 = Cur1;

		printf("\n%i \t : %i \t\t %i ms\n", i, strlen((char *)Buffer1)*4, clock() - Temp);
	}
	while(i++ < Iteration);

    if(Sauve)
    {
    	Fichier = fopen("suite.txt", "w");
        fprintf(Fichier, "Iteration : %i\nTaille : %i\n", i-1, strlen((char *)Buffer1)*4);
        Cur1 = Buffer1;
        do
        {
            fprintf(Fichier, "%i", GetBase4(*(Cur1++)));
        }
    	while(GetBase4(*Cur1));
        fprintf(Fichier, "\nExecuter en %i ms\n", clock() - Temp);
        fclose(Fichier);
    }
    
  	free(Buffer1);
  	free(Buffer2);

	return 1;
}


 Conclusion

il s'execute depuis une console, taper le nom du programme compiler et vous aurez l'aide.

j'ai pas reussi a calculer l'iteration 75, ce qui generer un nombre de 840 millions de chiffres  (.txt de 840mo)

il utilise en memoire la moitier de se que vous entrer en buffer, soit 2Go pour un buffer de 4 000 000 000


 Historique

03 novembre 2004 10:35:00 :
.

 Sources du même auteur

Source avec Zip Source avec une capture PROPA [SDL]
Source avec Zip Source avec une capture TEXT SDL
Source avec Zip Source avec une capture SERVEUR METEO, IHM EVOLUEE (VC6, CONSOLE WINDOWS, SOCK, THRE...
Source avec Zip Source avec une capture FIBO, CALCULE DE LA SUITE DE FIBONACCI AVEC SUPORT DES GRAND...
Source avec Zip Source avec une capture GESTION ACCESS, PROJET FORMATION, CONSOLE WINDOWS

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de coucou747 le 03/11/2004 17:11:07 administrateur CS

peux tu expliquer comment a la main on fait ta suite ? et a quoi sert-elle ? quels sont ses caractèristiques ?

Commentaire de BruNews le 03/11/2004 20:26:08 administrateur CS

Faudrait des explications sur cette suite sinon on ne trouvera aucun interet a cette source et alors....

Commentaire de ymca2003 le 04/11/2004 09:58:29

le truc c'est que pour passer d'une ligne à l'autre il faut "épeler" la ligne du dessus (grouper les chiffres identiques et dire combien il y en a)
1 -> un '1' -> 11
11 -> deux '1' -> 21
21 -> un '2', un '1' -> 12 11
1211 -> un '1', un '2', deux '1' -> 11 12 21
...

Commentaire de LiBe444 le 04/11/2004 20:06:52

Bonjour,
Ha c'est incroyable ce que cette suite peut être un classique...
J'ai été completement étonné de voir cette source, tu sais?

--> http://www.delphifr.com/code.aspx?ID=21504

@+

Commentaire de aerith le 19/11/2004 15:56:21

merci pour l'explication ymaca2003

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales