Teste, ob eine bestimmte Zahl eine Vampirzahl ist


14

EDIT: Um die Komplexität zu erhöhen, habe ich der Herausforderung mehr hinzugefügt.

In der Mathematik ist eine Vampirzahl (oder wahre Vampirzahl) eine zusammengesetzte natürliche Zahl v mit einer geraden Anzahl von Ziffern n, die in zwei ganze Zahlen x und y mit jeweils n / 2 Ziffern und nicht beide mit nachgestellten Nullen zerlegt werden kann. Dabei enthält v genau alle Ziffern von x und von y in beliebiger Reihenfolge, wobei die Multiplizität gezählt wird. x und y heißen die Reißzähne.

Weitere Informationen zu Vampire Number

Pseudovampir-Zahlen

Pseudovampir-Nummern ähneln Vampir-Nummern, mit der Ausnahme, dass die Reißzähne einer n-stelligen Pseudovampir-Nummer nicht mindestens zwei Ziffern lang sein müssen. Pseudovampir-Zahlen können eine ungerade Anzahl von Ziffern haben, zum Beispiel 126 = 6 × 21.

Eingang

Akzeptiere Zahlen von der Kommandozeile oder stdin

Ausgabe

  • "1260 = 21 * 60" (kleinerer Fang zuerst, wenn die Zahl ein Vampir ist.)
  • "1261 ist keine Vampirzahl." (wenn die Nummer keine Vampirnummer ist)
  • "126 = 6 * 21". (wenn die Nummer eine Pseudovampir-Nummer ist)

BEARBEITEN: Wenn die Nummer mehrere Reißzähne hat, zeigen Sie es so an.

x = fang1a * fang1b = fang2a * fang2b

Ich habe mich entschieden, Prime Vampire nicht einzuschließen, ich werde nicht über Bord gehen.
— st0le

Vielleicht sollte ich Printing hinzufügen, wenn es ein Vampir oder ein PseudoVampir ist. Was sagt ihr?
— st0le

Was ist mit mehreren Paaren von Reißzähnen?
— Gnibbler

@knibbler, ich werde es wieder gutmachen.
— st0le

1
@Nakilon, drucke sie in aufsteigender Reihenfolge. fang1aErscheint vor fang2awannfang1a < fang2a
— st0le

Antworten:


5

Python - 188 Zeichen

Tut keine Pseudovampir-Zahlen

from itertools import*
n=input()
a=[]
for i in map("".join,permutations(`n`)):x,y=int(i[::2]),int(i[::-2]);a+=[(x,y)]*(x*y==n)
print n,a and"=%s*%s"%min(a)or"is not a Vampire Number"

Behandelt auch nicht mehrere Paare (für 125460) und Speicherplatz, der danach verpasst wird =.
— Nakilon

( hier überprüft )
— Nakilon

@Nakilon, diese Antwort ist älter als die Änderung für mehrere Paare
— Gnibbler

4

Rubin, 190 Zeichen

o=[]
[*x.chars].permutation{|r|a=r.pop(x.size/2).join.to_i
r=r.join.to_i
o|=[[a,r]]if a<=r&&a*r==x.to_i}
puts x+(o.any? ? o.map{|i|" = "+i*" * "}*"":" is not a Vampire Number.")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.