2009-05-18 4 views
0

J'ai une boucle for générant des entiers.Comment puis-je supprimer les zéros en tête d'un entier généré par une boucle et le stocker en tant que tableau?

Par exemple:

for (int i=300; i>200; i--) 
    {(somefunction)*i=n; 
    cout<<n; 
    } 

Cela produit une sortie sur l'écran comme ceci:

f=00000000000100023; 

Je veux stocker la 100023 partie de ce nombre (c.-à-ignoreront simplement tous les zéros avant la les nombres non nuls commencent mais gardent les zéros qui suivent) sous la forme d'un tableau.

Comme ceci:

array[0]=1; 
array[1]=0; 
array[2]=0; 
array[3]=0; 
array[4]=2; 
array[5]=3; 

Comment pourrais-je aller sur la réalisation de cela?

+0

Si votre numéro est stocké sous la forme d'un entier f, il ne sera pas stocké comme f = 0000000 ... peu importe. Les entiers ne stockent pas les zéros en tête. –

+0

dupliquer: http://stackoverflow.com/questions/515612/convert-an-integer-number-into-an-array – lothar

+1

@ lothar -puis que la question est différente dans ce qu'elle propose je ne la vois pas comme étant un dupliquer – TStamper

Répondre

4

C'est un méli-mélo de réponses, parce qu'ils sont tous là, je ne pense pas que vous voyez la solution. Tout d'abord, si elles sont des entiers Bill's answer avec les autres réponses sont bonnes, sauf certaines d'entre elles sautent sur la partie "stocker dans le tableau". En outre, comme indiqué dans un commentaire sur votre question, cette partie est a duplicate.

Mais avec votre nouveau code, la solution que j'avais en tête était John's solution. Vous avez juste besoin de savoir comment ignorer leader de zéro, ce qui est facile:

std::vector<int> digits; 
bool inNumber = false; 

for (int i=300; i>200; i--)  
{ 
    int value = (somefunction) * i; 

    if (value != 0) 
    { 
     inNumber = true; // its not zero, so we have entered the number 
    } 

    if (inNumber) 
    { 
     // this code cannot execute until we hit the first non-zero number 
     digits.push_back(value); 
    } 
} 

Fondamentalement, il suffit de ne pas commencer à pousser jusqu'à ce que vous avez atteint le nombre réel.

2

La façon simple serait

std::vector<int> vec; 
while(MyInt > 0) 
{ 
    vec.push_back(MyInt%10); 
    MyInt /= 10; 
} 

qui stocke les décimales dans l'ordre inverse (vecteur utilisé pour simplifier mon code).

+0

push_front serait mieux, mais j'utilise normalement push_back avec des vecteurs – stefaanv

3

À la lumière de la question éditée, ma réponse originale (ci-dessous) n'est pas le meilleur. Si vous devez absolument avoir la sortie dans un tableau au lieu d'un vecteur, vous pouvez commencer par la réponse de GMan puis transférer les octets résultants dans un tableau. Vous pourriez faire la même chose avec la réponse de JohnFx une fois que vous avez trouvé le premier chiffre différent de zéro dans son résultat.


Je suppose f est de type int, auquel cas il ne stocke pas les zéros à gauche.

int f = 100023; 

Pour commencer, vous devez trouver la longueur requise de la matrice. Vous pouvez le faire en prenant le journal (base 10) de f. Vous pouvez importer la bibliothèque cmath pour utiliser la fonction log10.

int length = log10(f); 
int array[length]; 

length devrait maintenant 6.

Ensuite, vous pouvez dépouiller chaque chiffre de f et le stocker dans le tableau en utilisant une boucle et l'opérateur module (%).

for(int i=length-1; i >= 0; --i) 
{ 
    array[i] = f % 10; 
    f = f/10; 
} 

Chaque fois à travers la boucle, le module prend le dernier chiffre en retournant le reste de la division par 10. La ligne suivante divise f de 10 pour se préparer pour la prochaine itération de la boucle.

+0

facture c'est une bonne réponse, mais j'ai fait une erreur en disant que le nombre était un nombre entier. Pardon! merci pour votre aide. – user103572

+0

question a maintenant été corrigé – user103572

2

Attendez une seconde. Si vous avez écrit le code qui génère les entiers, pourquoi l'analyser dans un tableau? Pourquoi ne pas simplement coincer les entiers dans un tableau de votre boucle?

int array[100]; 

for (int i=300; i>200; i--)  
{ 
    array[i]= (somefunction)*i;  
} 
+0

il est nécessaire de se débarrasser des zéros précédents comme le nombre requis ne sera utile que si c'est l'ordre correct, l'espoir qui aide – user103572

+0

Je pense toujours que cela va fonctionner. Les zéros en tête d'un entier sont simplement logiques. S'ils apparaissent dans votre programmation, il s'agit simplement d'un problème de formatage et non d'un problème de stockage. En fait, il faut du travail EXTRA pour que les zéros de tête apparaissent comme ça. Le code que vous avez fourni dans la question d'origine ne produirait pas la sortie que vous avez décrite. – JohnFx

+1

Après avoir examiné votre code un peu plus, je pense que vous pourriez confondre ce que cout affiche et ce qui est réellement stocké. Vous pourriez avoir, par exemple, setfill ('0') quelque part dans le code qui tapera le numéro lorsqu'il sera imprimé via COUT. – JohnFx