[C] suite supercroissante aléatoire

Signaler
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006
-
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006
-
Salut vous tous, je vous expose mon souci :
je cherche à faire un programme qui me fourni une suite aléatoire supercroissante d'entier (un suite supercroissante est une suite dont le terme i est superieur à la somme de tous les terme précédents). Je dosi avoir une suite de 32 éléments. Or avec des longs ca pose un problème car je sors toujours de l'intervalle des longs.... En fait il faudrait ke je puisse passer à 64 bits.

Auriez vous une idée de comment je peux faire ?

MERCI !!! :) :)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------

17 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Passe à 64 bits tiens
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

Oui, ca je c bien.... mais comment ?????? je suis un gros débutant....

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
__int64 sous VC++
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

J'ai essayé avec ca, mais y a un truc ki couille apparement...
tout semble se passer comme si il ne reconnaissait pas le __int 64 lors de l'utilisation du programme... Pour info je travaille sur .NET

Merci encore pour les infos :)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
si tu l'écris en 2 mots c'est normal. Sinon tu peux créer une classe Int64, qui contiendra 2 entiers.
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

oups.... je te rassure, sur mon source je l'ai marker en un seul... mais ca marche pas kan meme... j'envoie d'ailleurs le source :


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
    __int64 somme=0, k=0;
    int i, oui =-1;
    __int64 a[32];

    srand( (unsigned)time( NULL ) );
    while (oui != 1)
    {
        do
        {
            somme=0;
            for(i=0 ; i<32 ; i++)
            {
 // Il faut vérifier qu'il sagit bien d'une suite supercroissante
                do
                {
// On fait un random sur k pour avoir un k 
// aléatoire compris entre 1 et 5.
                    k=rand()%5;
                 }while (k<=0);
                 a[i] = rand()%k+somme+1;
                 somme += a[i];
             }
        }while ((a[30]>100000000));
// Dépasser ces valeurs pour ces éléments nous fait sortir de l'intervalle des long
    for(i=0 ; i<32 ; i++)
    {
        printf("L\\'element %2ld est : %11ld\\n",i+1, a[i]);
    }
    printf("\\nCette suite vous convient-elle ? : oui(1) ou non(2)");
    fflush(stdin);
    scanf("%ld",&oui);
    printf("\\nla somme 111 est de : %ld", somme);
    }
}


Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
bizarre, moi il compile tres bien
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

Moi aussi il compile ss pb, mais lors de l'utilisation, c des intke g... pas des __int64... d'où kestion....

En meme temps j'utilise .NET et pas VC++. Ca vient peut etre de là.... bref si kkun voit...

En tt cas, merci vecchio56 et aux autres aussi ;)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

Kel est le format kil faut utiliser pour mes printf ??? juskà présent j'utilisais des %ld... peut etre ke mon problème vient uniquement de là..

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
avec printf en effet ca va etre difficile je crois
je te propose d'utiliser les E/S de C++:

__int64 i = 4294967326;
std::cout << i;

marche tres bien

si tu veux faire ca en C tu récupère deux entiers sur 32 bits grace aux décalages à partir du __int64 et tu codes toi meme l'addition
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
#include <stdio.h>

int longueur(unsigned __int64 i)
{
int l = 1;
while(i /= 10)
++l;
return l;
}

void format_int64(unsigned __int64 i, char* res)
{
int l = longueur(i);
res[l] = 0;
do
{
res[--l] = (int)(i % 10) + '0';
} while(i /= 10);
}

int _tmain(int argc, _TCHAR* argv[])
{
unsigned __int64 i = 18046744073709551615;
char res[30];
format_int64(i, res);
printf(res);
return 0;
}
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

Euh....

Va pas falloir le prendre mal, mais je crois ke g rien compris....

En soit, je connai tous les terme ke tu emploi, mais la sauce final, je la comprend pô...

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
- longeur retourne la longueur de l'entier (par exemple: 1000 -> 4)

- format_int64 sert a imprimer un __int64 non signé dans une chaines de caractères pour pouvoir ensuit l'afficher à l'écran, rien de tres compliquer je pense

Si tu veux tu peux utiliser une classe que j'ai faite et qui permet de manipuler des entiers aussi grands que l'on veut, tu peux la récupérer ici:
http://www.cppfrance.com/code.aspx?ID=19105
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

J'ai trouvé comment faire (enfin, une amie m'a aidée :) ), en fait il y a juste besoin de jouer sur le format.... à la place de mettre %ld il fallait mettre %I64 !!!!

Et maintenant ca marche du tonnerre !!!!! Je garde kan meme tes 2 solutions de coté.. je sens ke ca pourra resservir ! ;)

En tout cas, MERCI beaucoup !!!!!!!!!!!!!!!!!!!!!

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
merci de l'info, je n'arrivais pas non plus a trouver quel format utiliser
Messages postés
10
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
8 février 2004

tient moi aussi je veux faire une suite super croissante j'avais entendu parler du __int64 mais pas du %i64 .
Hors j'ai teste %i64 et ca me fait comme si je fesait %i puis ca ecrit 64 !

donc je comprend pas trop : j'utilise Visual Studio 6 et Dev-c ++

si vous pouviez m'eclairez !

merci d'avance !
Messages postés
41
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
5 avril 2006

Yop

Essaye avec un i majuscule : %I64

ou sinon essaye avec un unsigned __int64 et dc pr ton format : %I64u

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------