Comment trouver le plus petit nombre avec juste 0 et 1 qui est divisé par un nombre donné?
Chaque entier positif diviser un nombre dont la représentation (base 10) ne contient que des zéros et de uns.
On peut montrer que:
Considérer les nombres 1, 11, 111, 1111, etc. jusqu'à 111... 1, où l'
le dernier numéro a n+1 chiffres. Appeler ces numéros m1, m2, ... , mn+1. Chacune dispose d'une
reste quand divisée par n, et deux de ces restes doivent être les mêmes.
Parce qu'il y a n+1, mais seulement n valeurs un reste à prendre.
Ceci est une application de la célèbre et utile “casier principe”;
Supposons que les deux nombres avec le même reste sont mi et mj
avec i < j. Maintenant soustraire la plus petite de la plus grande. Le nombre qui en résulte, mi−mj, composé de j - je celles suivies par je zéros, doit être un multiple de n.
Mais comment faire pour trouver le plus petit élément de réponse? et effciently?
source d'informationauteur Sayakiss
Vous devez vous connecter pour publier un commentaire.
Belle question. J'utilise BFS pour résoudre cette question avec meet-in-the-middle et quelques autres résidus de taille. Maintenant mon code peut résoudre les n<109 dans un délai raisonnable.
La question est égal à l'aide des 10me mod n (pour chaque i, il peut être utilisé plus d'une fois) pour obtenir une somme m de n. C'est comme un problème de sac-à-dos ou sous-ensemble somme problème. De cette façon, la programmation dynamique va faire la tâche.
De la programmation dynamique la complexité est
O(k*n)
. k est le nombre de chiffres dans la réponse. Pour le n<105ce code fonctionne parfaitement.Code:
PS:
Cette séquence OEIS.
Il y a un O(n) en temps (opérations arithmétiques mod n), solution, qui est plus efficace que la réponse actuellement acceptées. L'idée est de construire un graphe de sommets 0..n-1 si le sommet i a des connexions à (i*10)%n et (i*10+1)%n, puis de les utiliser en largeur d'abord de recherche pour trouver le lexicographiquement moins de chemin d'accès de 1 à 0.
Ici est un
readable
solution à l'aide de la BFS java. L'approche est similaire à David avec quelques améliorations.Vous construire un arbre de décision de savoir si pour l'ajout d'un 0 ou d'un 1 et d'effectuer des BFS pour trouver le plus bas valide multiple du nombre d'entrée.
Cette solution utilise également modulo (le nombre d'entrée) pour calculer vraiment de grands résultats. Description complète disponible dans les commentaires dans le code.
Vous pouvez également accéder à la même extrait de code dans ideone.
Je pense que c'est un juste et intéressante question.
Veuillez noter que bien que ce que vous décrivez est une preuve il existe toujours un tel nombre, le trouvé pas de numéro de toujours être minime.
Seule solution que je vois est de calculer les résidus des puissances de 10 module donné
n
et que d'essayer de construire une somme donnant reste 0 modulo n à l'aide d'au plus un seul de chacun de ces pouvoirs. Vous n'aurez plus jamais besoin de plus de n différents pouvoirs(qui vous le prouver, je votre question).C'est un moyen rapide pour obtenir le premier 792 réponses. Def la plus simple: code:
Voici une solution C# à l'aide de liste liée
Mon algorithme :-
1)Construire le tri arbre de n nombres possibles(disons n, est initialement 10). Donc, dans cet exemple, il contiendra 1,10,11,100,101,110,111....
2)Ensuite, une boucle sur la liste et d'effectuer sur chaque pas de x%GivenNo, si son o son plus petit possible, pas de
3)Sinon, répétez l'étape 3 avec un autre 10 numéros
Ici est complète de code c# en O(n) à l'aide graphique et bfs approche.