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 / Exemple :
#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;
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
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.