Gegeben eine Zahl N, finde die kleinste "Null-Eins" -Nummer S, die ein Vielfaches von N ist. Eine "Null-Eins" -Nummer besteht aus den Ziffern 0 und / oder 1.
z. Wenn N=4
dann S=100
Hier ist 100
das kleinste ganzzahlige Vielfache von 4
, dessen Darstellung nur aus 0
und / oder 1
Ziffern besteht.
Ich habe es auf rohe Weise versucht, aber ich suche nach einer effizienten Lösung.
Sie müssen nach der kleinsten Zahl suchen, um N
zu multiplizieren.
Ich würde die Zahl inkrementell erstellen, beginnend mit der niedrigstwertigen Ziffer.
Angenommen, N = 7. Was sind die möglichen niedrigstwertigen Ziffern der Multiplikationszahl? Es wird eine Zahl sein, die, wenn Sie mit 7 multiplizieren, ein Ergebnis mit der niedrigstwertigen Ziffer von 0 oder 1 hat. Wenn Sie die Zahlen von 0-9 versuchen, kann es nur '0' oder 3 'sein.
%Vor%Dann versuchen Sie die zweitniedrigste Ziffer. Sie werden jetzt versuchen 00, 10, 20, 30, 40, 50, 60, 70, 80, 90 und 03,13,23,43,53,63,73,83,93. Die erfolgreichen Kandidaten werden diejenigen sein, bei denen, multipliziert mit 7, eine Zahl erzeugt wird, in der die zwei niedrigstwertigen Ziffern 0 oder 1 sind. Sie erhalten '43', '30', '00' und '01'.
Wiederholen Sie diesen Vorgang mit der dritten Ziffer, wobei Sie die Nummer finden, die ein Vielfaches mit 3 niedrigstwertigen Ziffern erzeugt, die die Qualitäten erfüllen.
Während des Vorgangs werden Sie eine Nummer finden, in der ALLE Ziffern die Qualitäten erfüllen, und das ist Ihre Antwort. Im Fall von N = 7 haben Sie es an der 3. Stelle gefunden. (7 * 143 == 1001).
Hier ist ein alternativer Ansatz mit BFS.
Beginnend mit einem Wurzelknoten mit dem Wert 1
, erstellen Sie einen Entscheidungsbaum, ob eine 0 oder 1 angehängt werden soll. Jeder Knoten repräsentiert somit eine Zahl, die die Ziffern 0s und 1s verwendet. Sie führen dann BFS durch, um die niedrigste Nummer zu finden, die ebenfalls ein Vielfaches der eingegebenen Nummer ist.
Diese Lösung nutzt auch Modulo (der Eingangsnummer), um wirklich große Ergebnisse zu berechnen. Ausführliche Beschreibung in den Kommentaren im Code verfügbar.
Sie können auch auf das gleiche Code-Snippet in ideone zugreifen.
%Vor%Wie wäre es damit: Sie versuchen eine Reihe von Zahlen: 1, 10, 100, 1000, 10000, ..... und Sie teilen jede Zahl durch N und Sie zeichnen den Rest auf Z.B. N = 9, 1/9 = 1 10 = 1 (mod 9), 100 = 1 (mod 9), .... Der Punkt ist, dass Sie eine bestimmte Zahl aus dieser Serie wählen müssen und sicherstellen, dass sich diese Reste zu einem Vielfachen von N addieren. Z.B. N = 9, dann addierst du 1, 10, 100, ....
Ich würde vorschlagen, den Algorithmus zu verwenden: Einmal die Summe des Rests der Reihe & gt; N, versuche im Rest nach Resten zu suchen, die zusammen N usw. ergeben.
Hier ist meine Lösung:
Kleinste "Null-Eins" -Nummer S kann beliebig sein von {1,10,11,100,101,110,111,1000 ,. . . }, Die binäre Zahlen sind. also,
Drucken Sie das Ergebnis aus.
klasse Programm {
%Vor%} }
Voraussetzung: Für jede Zahl N, finden Sie eine Zahl S (+ ve Integer), die ein Vielfaches von N ist, aber eine Null-Eins-Zahl.
Kurzer Algorithmus:
Beginnen Sie mit 1 in einer Liste.
Dann iteriere obige Liste und berechne folgende zwei Werte für jeden möglichen Wert dieser Liste
%Code%
%Code%
%Code%
x = list[i]*10;
Hier ist C # -Code (a hat einen Dummy-Wert)
%Vor%Hier ist mein Algorithmus:
1) Beginnen Sie mit 10 (binär 2). 2) wandle dies in eine Zeichenfolge um, so dass es "10" ist 3) wandle diese Zeichenfolge in Dezimal 4) teile diese Dezimalzahl durch die Eingabe n. 5) addiere 1 in der Binärzahl 10, Ergebnis ist 11 6) wiederhole 2-5, bis der Rest 0 ist;
Tags und Links algorithm