Cette question sera d'environ 100 points de portes qui constituent un problème célèbre de Rosetta. Voici le problème:
La question: strong> Dans quel état sont les portes après la dernière passe? Qui sont ouverts, qui sont fermés? P> 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. p>
3 Réponses :
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;
}
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> 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);
Un code rubis simple pour ce problème serait le suivant: sortie: 10 p> p>
Pas mal de gros problèmes. 1.
portes code> est utilisé tout en étant inintitualisé. 2.{portes [i] == 1;} code> doit être{portes [i] = 1;} code>Pour la finale
pour code> boucle,b = 100 code> doit êtreb <= 100 code>.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] code> inutilisé et à partir de 1.Aussi: vous pouvez utiliser booléen pour
portes [] code> et basculer avecportes [i] =! Portes [i] code> 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 code>. 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 ++) code> etprintf ("% d \ n", b + 1); code>.@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 code> 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.