0
votes

100 portes Problème solution ne fonctionne pas comme prévu

Cette question sera d'environ 100 points de portes qui constituent un problème célèbre de Rosetta. Voici le problème:

  • Il y a 100 portes consécutives dans une rangée qui sont toutes initialement fermées.
  • Vous faites 100 passes par les portes.
  • La première fois, visitez toutes les portes et faites basculer la porte (si la porte est fermée, ouvrez-la; s'il est ouvert, fermez-le).
  • La deuxième fois, visitez toutes les 2nd porte (porte n ° 2, n ° 4, n ° 6, ...) et le basculer.
  • La troisième fois, visitez toutes les 3ème porte (porte n ° 3, n ° 6, n ° 9, ...), etc.), etc.), jusqu'à ce que vous ne visitant que la centième porte.

    La question: Dans quel état sont les portes après la dernière passe? Qui sont ouverts, qui sont fermés?

    Donc, mon point est donc de donner un programme une entrée, disons n, donc après Nth Pass, quelles portes seront ouvertes genre de chose, mais il y a un flux de coulée et je pouvais ne pas le trouver. S'il y a quelqu'un qui peut corriger les problèmes de ma logique, je serais heureux. Merci à tous. xxx

c

12 commentaires

Pas mal de gros problèmes. 1. portes est utilisé tout en étant inintitualisé. 2. {portes [i] == 1;} doit être {portes [i] = 1;}


Pour la finale pour boucle, b = 100 doit être b <= 100 .


OT: Les tableaux en C démarrent à l'index zéro. Vous pouvez faire vos matrices 1 plus grand que nécessaire et utilisez uniquement l'index 1 et vers le haut, mais ... si vous voulez être un programmeur C, vous feriez mieux de commencer à partir de zéro. Aucune entreprise n'acceptera votre style de codage!


@ 4386427 Cela dépend. Si cela rend le code plus simple (et plus petit), il n'y a pas beaucoup de mal à quitter portes [0] inutilisé et à partir de 1.


Aussi: vous pouvez utiliser booléen pour portes [] et basculer avec portes [i] =! Portes [i] et .


@Ianabbott Il y a toujours des exceptions à des "règles générales" (même à la règle "Never utilise goto"). Mais avoir l'indice 0 pour représenter le premier article est très fondamental dans C et pour ce programme, il ne semble pas de gagner significatif dans rien d'autre.


Vous lisez dans x . Je suppose que c'est censé être le nombre de portes (!?) Mais vous avez toujours du mal au code des autres boucles à 100


@ 4386427 Eh bien, vous auriez besoin d'ajouter ou de soustraire 1 dans quelques endroits. Par exemple. pour (i = j-1; i <100; i ++) et printf ("% d \ n", b + 1); .


@Ianabbott Ajout d'un 1 Quelques endroits est imo pas assez pour casser la règle fondamentale que l'indexation de la matrice commence à zéro


@ 4386427 Je pense que x est supposé être le nombre de passes.


@Ianabbott Le nombre de passes doit être égal au nombre de portes. C'est comme ça que le puzzle fonctionne. Si vous ne le faites pas, vous n'obtiendrez pas la sortie «drôle»: 1 ^ 2, 2 ^ 2, 3 ^ 2, 4 ^ 2, 5 ^ 2, .. (I.e. 1 4 9 16 25 ...)


En fait, mon idée de l'index du tableau était la suivante: je les considère comme des portes, et comme il n'y a pas de 0ème porte, je voulais 1 autre élément de tableau puis 100 et n'utilisez pas le 0ème du tout. Aussi, je pensais que l'inaitilisation de la matrice donne à tous les éléments automatiquement zéro.


3 Réponses :


2
votes

OK, il y avait quelques erreurs dans votre code:

#include <stdio.h>
#define NDOORS 100

int main() {
    int doors[NDOORS] = { 0 };

    for (int j = 1; j <= NDOORS; j++)
    {
        for (int i = j-1; i < NDOORS; i += j)
        {
            doors[i] = 1 - doors[i];
        }
    }

    for (int b = 0; b <= NDOORS; b++) {
        if (doors[b] == 1)
        {
            printf("%d\n", b+1);
        }
    }

    return 0;
}


0 commentaires

1
votes

La réponse donnée ici https://stackoverflow.com/a/61366204/4386427 est la réponse à accepter comme Il explique les problèmes du code et fournit une solution.

Je veux juste ajouter que le problème concerne le nombre de fois que vous basculez une porte. p>

Si vous le basculez un nombre pair de temps, la porte sera toujours fermée à la fin. p>

Si vous le basculez un nombre impair de fois, la porte sera ouverte à la fin. P>

Ceci est descendu au nombre de Diviseurs Un nombre de porte a, c'est-à-dire un nombre même de diviseurs ou un nombre impair de diviseurs. p>

exemple: p> xxx pré>

Les seuls numéros ayant un nombre impair de Les diviseurs sont des chiffres carrés. P>

Par conséquent, vous pouvez simplement faire: P>

int numDoors = 100;
for (int i=1; (i*i) <= numDoors; ++i) printf("%d\n", i*i);


0 commentaires

0
votes

Un code rubis simple pour ce problème serait le suivant: xxx

sortie: 10


0 commentaires