2017-09-28 1 views
0

Donc, je faisais quelque chose pour une affectation en C# pour imprimer les noms des personnes dans chaque combinaison. S'il y avait 5 personnes par exemple, j'ai utilisé un nombre binaire à 5 chiffres et je lui ai juste ajouté 1 après chaque itération.Comment incrémenter des nombres binaires où 1 supplémentaire est ajouté ou 1 est enlevé

00000 imprimé aucun nom 00001 imprimé prénom 00010 imprimé deuxième nom 00011 imprimé prénom et nom

... et ainsi de suite. Finalement, je pouvais parcourir et imprimer toutes les combinaisons de noms.

Ainsi, on m'a demandé de penser à la façon dont je pourrais le faire seulement dans un nom a été ajouté ou un nom a été soustrait. Si je comprends bien, je dois être en mesure d'imprimer systématiquement chaque combinaison, mais la combinaison suivante imprimée ne peut avoir qu'un nom de plus que le dernier ou un nom de moins que le dernier.

Je cherche de l'aide pour trouver une approche logique. J'ai commencé ici:

  00000 0 names 
Add 1   00001 1 name 
double, add 1 00011 2 names 
subtract 1  00010 1 name 
double, add 1 00101 2 names 
subtract 1  00100 1 name 

Ici, je ne vois pas un modèle logique parce que si je double encore une fois je manque sur 00111 par exemple si cela n'a pas été bonne. De toute façon je suis bloqué pour le moment.

Je n'ai pas besoin de code, je peux l'écrire moi-même. J'ai juste besoin d'une idée sur une meilleure logique. Je choisis seulement l'approche de nombre binaire ici parce que c'est ce qu'on m'a demandé de penser. Toutes les idées seraient géniales. vous

+0

Est-ce que votre classe vous permet d'utiliser les opérateurs de bits? – Powerlord

+0

Nous en avons brièvement parlé il y a un certain temps, donc je suppose que oui – RSon1234

+0

Si vous votez en bas, pourriez-vous expliquer pourquoi? J'ai décrit ma question, montré ce que je pensais et je ne demande pas la réponse directement à l'écriture du code. Cela ne me dérange pas de m'adapter mais de dire quelque chose. J'ai fait des recherches. Je suis toujours. Désolé, si cette question ne vaut pas le temps des gens. – RSon1234

Répondre

0

thank Essayez ceci:

var found = new HashSet<string>(); 

IEnumerable<string> Mutate(string current) 
{ 
    for (var i = 0; i < current.Length; i++) 
    { 
     var sb = new StringBuilder(current); 
     sb[i] = sb[i] == '0' ? '1' : '0'; 
     var r = sb.ToString(); 
     if (!found.Contains(r)) 
     { 
      found.Add(r); 
      yield return r; 
      foreach (var r2 in Mutate(r)) 
      { 
       yield return r2; 
      } 
     } 
    } 
} 

var results = Mutate("00000").ToArray(); 

Il produit:

 
10000 
00000 
01000 
11000 
11100 
01100 
00100 
10100 
10110 
00110 
01110 
11110 
11010 
01010 
00010 
10010 
10011 
00011 
01011 
11011 
11111 
01111 
00111 
10111 
10101 
00101 
01101 
11101 
11001 
01001 
00001 
10001