Matrice a 2 dimensions de grande taille

cs_onedream Messages postés 3 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 11 novembre 2008 - 10 nov. 2008 à 23:15
cs_onedream Messages postés 3 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 11 novembre 2008 - 11 nov. 2008 à 18:27
salut;
je viens de faire un programme mais sa marche pas bien .l énoncé d éxercice est :

le probleme en général c de saisir un nombre n <5 et saisir un nombre que je vais l appeler : dim
ensuite remplir une matrice qui sera de cette forme A[dim][n^dim]
n^dim=n puissance dim
et cette matrice sera rempli par les chifrres: 0,1,2,..,n
cad si n=4 et dim =18 la matrice sera de la taille A[18][4^18]
ensuite saisir un vecteur par example B[de 1 jusqu à dim][1] en suite saisir le nbre minimal de différence(diff) entre les colonnes et le vecteur saisi
et en résultat : afficher un tableau résultant qui regroupe des colonnes qui ont un nombre de différence supérieur ou égale au nombre saisi(diff)
et voila mon programme mais comme je vous ai dit il y a certain beug comme la taille qui n est pas acceptée car pour un dim= 18 pour une base ternaire n=3 ou quaternaire n=4 sa se bloque
et encore pour la différence je vois qu il y a en résultat certaine colonne qui se répétent ou que la différence est inférieure a la différence demandée

#include
#include<conio.h>
#include<math.h>
using namespace std;
int main()
{  
    int dim,dim2,diff,m,d,di,i;
    int i2,i3,n,e,col,jm,j;
    int A[10][50000000];
 int x,w,k;
    cout <<"donner la puissance de la matrice :";
    cin >>n;
    cout <<"donner la dimension (puissance) de la matrice :";
    cin >> dim;


    e=3^dim;
    cout <<"\n 3 puissance "<<dim<<"est "<< e<<"\n";
   


// remplissage de la matrice par des 1,2,3...
// de telle sorte que chaque ligne soit differente de l autre


    for(m=1;m<dim+1;m++)
      { x=3^(m-1);
     w=3^(dim-m);
     k=3^(dim-m+1);
     for(i=0;i<x;i++)
       for(j=1;j<w+1;j++)
       for(i3=1;i3<n;i3++)
    {  
     col=j+i*k+(i3-1)*w;
     A[m][col]=i3;
      
       }
      }

//saisir le vecteur qu on veux comparer
cout<<"\n Entrer le vecteur qu on veux comparer:\n");
for(m=1;m<dim+1;m++)
{ cout<< "A["<<m<<"][0]="; cin>>A[m][0];
}


//saisir le nombre de difference entre les lignes


do { cout <<"\nEntrer le nombre de difference entre les lignes :";
  cin >>di;
      }
while (di>=dim);
// traitement sur les difference entre les lignes
// je ne retiens que les lignes qui ont une difference >= di




for(i2=1;i2<10;i2++)
{ for(i=0;i<e+1;i++)
   {diff=0;jm=i;
     for(j=i+1;j<e+1;j++)
      { diff=0;
     for(m=1;(m<dim+1)&&(diff<di);m++)
  // une fois la difference >= di je sors de la boucle m
  { if(A[m][i]!=A[m][j])
       {  diff=diff+1;
   if (diff>=di)
        { jm=jm+1;dim2=jm;
   for(d=1;d<dim+1;d++)
   { A[d][jm]=A[d][j];
   }
        }




       }
 }
      }e=jm;dim2=jm;
    }
}
cout <<"\n le nombre de lignes resultantes est :"<<dim2;
for(k=1;k<dim2+1;k++)
{cout <<"\n";  // pour voir les resultats
if(k%40==0){ cout<<"\n appuyer sur touche....!\n";
cinb;}
for(m=1;m<dim+1;m++)
  { cout <<A[m][k];}
  }


   return 0;


}

fin du programme...

s il y ades erreurs c que j ai traduit le programme de c a visual c++

4 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
11 nov. 2008 à 07:08
En C/C++, l'opérateur ^ est l'opérateur "ou exclusif bit à bit".
0
cs_onedream Messages postés 3 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 11 novembre 2008
11 nov. 2008 à 09:41
merci pour la remarque j ai pensé que c est une puissance
pow(3,2)=3^2=9
mais il n accepte pas la fonction pow
ce programme je l ai fais en c mais en déclarant une matrice de grande taille A[20][5 000 000] sa passe pas il me donne erreur de size array so long
j ai pensé le faire en visual c++ car cette déclaration pass en v c++ et j aimerais bien le traduire en ce language.
en visual c++ je ss trés trés debutant.
le remplissage de la matrice consisite que chaque ligne soit différente de l autre en suite saisir un vecteur et en résultat ne retenir que les lignes qui ont une différence >= di
merci de votre aide.
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
11 nov. 2008 à 16:28
Tu n'y arriveras pas, et à cette échelle, ça ne dépend pas du langage. Ton tableau A[20][5 000 000] occupe déjà 400 Mo de mémoire juste avec une dimension de 5 000 000, alors imagine avec une dimension de 4^18 !!!

Et même si tu réussissais à réaliser une telle matrice, tu ne pourras faire aucun calcul avec un PC.

Tu devrais coller dans ce post l'énoncé exact du problème, car il y a forcément quelque chose qui t'a échappé. La plupart du temps, les matrices géantes sont des matrices parsées, c'est-à-dire, dont tous les coefficients sont nuls sauf quelques-uns, et leur gestion ne se fait pas dans des tableaux classiques.

PS : pour utiliser pow, il faut ajouter en c++ la directive #include <cmath>
0
cs_onedream Messages postés 3 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 11 novembre 2008
11 nov. 2008 à 18:27
merci pour l explication
mon pc portable a 2go de ram en + si je fais exécuter le programme en déclarant un autre e2 par example, et je la remplace avec dim2 :
long int e2
cout <<"\n le nombre de lignes resultantes est :"<<e2;
for(k=1;k<e2+1;k++)
{cout <<"\n";  // pour voir les resultats
if(k%40==0){ cout<<"\n appuyer sur touche....!\n";
cinb;}
for(m=1;m<dim+1;m++)
  { cout <<A[m][k];}
  }

et puisque e2 est de type long elle va prendre une drande valeur 116 235 116(il a pris une valeur équivalent a sa) le programme tourne et il me donne la matrice en la remplissant par des valeurs aléatoires.cad sa peut fonctionner je crois.
et si on se limite a 4^9 et 3^13 est ce qu il y a une solution? et merci d avance. 
0
Rejoignez-nous