2016-07-05 11 views
-3

Ich habe eine Reihe von Ziffern {d1, d2, d3 ...... dn} wo, 1 < = di < = 9. 1 < = n < = 9Wie viele Zahlen gibt es bis N, die Ziffern 2,3,5 haben und durch 2,3,5 teilbar sind?

Nun wünsche ich, um herauszufinden, wie viele Zahlen gibt es < = N, die in ihnen alle diese Ziffern haben, in beliebiger Reihenfolge, und alle diese Zahlen sind auch durch diese Ziffern teilbar.

Die Art, wie ich denke, ist nur von der ersten Nummer mit der Länge n zu N iterieren und überprüfen, aber gibt es effizientere Lösung?

Beispiel:

D = {2,3,5} und N = 10^10

wie viele Zahlen sind, die diese Stellen alle in ihnen haben und sind auch Mehrfaches von 2,3 und 5.

+0

Zumindest kommentieren und sagen, was falsch ist, bevor Sie ohne Grund ablehnen? – user6549346

+0

Ich habe nicht downvote, aber die Schaltfläche Downvote hat einen Tooltip "Diese Frage zeigt keine Forschungsbemühungen ...". Das mag hier zutreffen - wenn Sie Beweise dafür angeben, was Sie versucht haben und wo Sie stecken geblieben sind, können Sie Verbesserungsvorschläge und hilfreichere Antworten erhalten.Wenn du wirklich keine Ahnung hast, wo du anfangen sollst, "probiere jede Zahl bis zu 10^10", dann versuchst du vielleicht Fragen, die momentan zu schwierig für dich sind und du solltest deine Lernbemühungen jetzt auf einfachere Fragen konzentrieren. Das soll keine Beleidigung sein, sondern nur etwas, das man berücksichtigen muss, wenn man versucht, sich zu verbessern. –

+0

22350 enthält 2,3 und 5 als Ziffern. Und es ist durch 2,3 und 5 teilbar. "Eine Zahl, die diese Ziffern enthält, die durch 2 teilbar sind, muss mit 2 enden, aber damit sie durch 5 teilbar ist, muss sie mit 5 enden" ??? – user6549346

Antwort

0

Ich bin nicht sicher von Ihrer Frage, wenn Sie Zahlen wollen, die nur durch 2, 3 und 5 teilbar sind, oder wenn Sie Zahlen durch eine andere Zahl teilbar akzeptieren, solange 2, 3 und 5 zu den Teilern gehören . Angenommen, die erste Alternative:

Zuerst berechnen Sie die Hamming-Nummern (Zahlen durch 2, 3 und 5 teilbar); es sind nur ein paar tausend von ihnen unter 10^10, und sie sind leicht zu berechnen. Zweitens, prüfe jede einzelne, um festzustellen, ob sie andere Ziffern als 2, 3 oder 5 verwendet.

Die Hamming-Zahlen können durch Induktion berechnet werden. Beginnen Sie mit 1, was eine Hamming-Nummer ist. Dann, wenn x eine Hamming-Nummer ist, so sind 2 x, 3 x und 5 x.

Wenn Sie Hilfe benötigen, um dies auf Code zu reduzieren, fragen Sie.

BEARBEITEN: Basierend auf dem Kommentar unten wollen Sie die zweite Alternative ("müssen alle Vielfachen von 2 überprüfen"). Betrachte dann den Fall für 2, 3 und 5. Erzeuge zuerst alle 1-stelligen Zahlen, die 2, 3 oder 5 enthalten, was trivial ist. Dann generiere alle 2-stelligen Zahlen mit 2, 3 oder 5: 22, 23, 25, 32, 33, 35, 52, 53, 55. Und so weiter für jede n -stellige Nummer bis zu deinem Limit. Schließlich, teste jeden auf Teilbarkeit; für die obige Liste wären 23 und 53 ausgeschlossen, da sie nicht durch 2, 3 oder 5 teilbar sind.

In beiden Fällen besteht der Trick darin, eine kleine Gruppe von Zahlen zu erzeugen, die eines der Kriterien erfüllen, und dann die andere Kriterien.

+0

Danke. Aber wenn D = {2}, dann wäre das ein Problem, da ich auf diese Weise alle Vielfachen von 2 überprüfen müsste. – user6549346

+0

Nicht verwandt, aber ich denke, deine Definitionen von Hamming-Zahlen sind falsch. Hamming Zahlen sind teilbar durch 2, 3, ** und/oder ** 5 ... aber nicht unbedingt 2, 3, ** und ** 5. https://rosettacode.org/wiki/Hamming_numbers – hymie

1

Wenn Sie nur iterieren, dann sollten Sie wissen, dass jede Zahl, die durch eine Reihe von Zahlen teilbar ist, auch durch das kleinste gemeinsame Vielfache (ich glaube, das ist der richtige Ausdruck) dieser Zahlen teilbar ist .

Also in Ihrem Fall, wenn eine Zahl von 2 und 3 und 5 teilbar ist, dann ist es auch um 30.

teilbar Das Ihre Iterationsplan beschleunigen sollte.

+0

So kann ich einfach nach Vielfachen von 30 suchen und sehen, ob sie 2,3 und 5 als Ziffern enthalten. Aber die Komplexität ist N * log (N)/30. Es reduziert nur die Zeit um den Faktor lcm (d1, d2, d3 .... dn). Gibt es einen schnelleren Weg? BTW, Danke für diesen Ansatz. – user6549346

Verwandte Themen