begin process at 2008 07 19 09:13:38
1 212 728 membres
67 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SUITE LOGIQUE (PORTABLE)


Information sur la source

Catégorie :Maths & Algorithmes Niveau : Initié Date de création : 03/11/2004 Date de mise à jour : 03/11/2004 10:35:00 Vu : 2 311

Note :
Aucune note

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
03 novembre 2004 10:35:00 :
.
  • signaler à un administrateur
    Commentaire de coucou747 le 03/11/2004 17:11:07

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

  • signaler à un administrateur
    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....

  • signaler à un administrateur
    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
    ...

  • signaler à un administrateur
    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

    @+

  • signaler à un administrateur
    Commentaire de aerith le 19/11/2004 15:56:21

    merci pour l'explication ymaca2003

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Boutique

Boutique de goodies CodeS-SourceS