Mise à jour 2: Certaines personnes pensent que l'utilisation de XOR pour trouver le numéro en double est un hack et astuce. À laquelle ma réponse officielle est: "je ne suis pas à la recherche d'un numéro en double, je suis à la recherche pour un double motif dans un tableau des ensembles de bits. Et XOR est certainement adapté de mieux que d'AJOUTER à manipuler des ensembles de bits". :-)
Mise à jour: Juste pour le plaisir avant d'aller me coucher, voici "on-line" solution alternative qui ne nécessite aucun stockage supplémentaire (même pas un compteur de boucle), touche chaque élément du tableau qu'une seule fois, est non destructif et n'est pas adaptée à tous :-)
printf("Answer : %d\n",
array[0] ^
array[1] ^
array[2] ^
// continue typing...
array[999] ^
array[1000] ^
1 ^
2 ^
// continue typing...
999^
1000
);
Notez que le compilateur va effectivement calculer la seconde moitié de cette expression au moment de la compilation, l ' "algorithme" va exécuter exactement 1002 opérations.
Et si l'élément de tableau de valeurs sont connues au moment de la compilation, le compilateur d'optimiser l'intégralité de la déclaration d'une constante. :-)
Solution originale: Qui ne répond pas aux exigences strictes des questions, même si cela fonctionne pour trouver la bonne réponse. Il utilise un entier supplémentaire de garder le compteur de la boucle, et elle accède à chaque élément du tableau à trois reprises, deux fois à le lire et à l'écrire à l'itération en cours et une fois à lire pour la prochaine itération.
Eh bien, vous avez besoin d'au moins une variable supplémentaire (ou un PROCESSEUR inscrire) pour stocker l'index de l'élément courant que vous allez à travers le tableau.
Hormis celle-ci, voici un destructeur algorithme qui peut en toute sécurité à l'échelle pour tout N jusqu'à MAX_INT.
for (int i = 1; i < 1001; i++)
{
array[i] = array[i] ^ array[i-1] ^ i;
}
printf("Answer : %d\n", array[1000]);
Je vais laisser l'exercice de comprendre pourquoi cela fonctionne pour vous, un simple conseil :-):
a ^ a = 0
0 ^ a = a