Trädvy Permalänk
Medlem
Registrerad
Maj 2012

Kapreker, python

Har en uppgift som lyder.
Skriv ett program som givet ett ingångstal beräknar hur många iterationer det krävs innan ovanstående process kommer till 6174.
Utdata ska vara antalet iterationer som krävs för att genom ovanstående process komma fram till talet 6174 från det angivna talet.
Min kod:

tal = str(input("Vilket är ditt fyrsiffriga tal?")) kapreker = 6174 antal_varv=0 while tal != kapreker: if tal != kapreker: n = tal sorted(n) sorted(n, reverse=True) large = int("".join(sorted(n, reverse=True))) small = int("".join(sorted(n))) tal = large - small else: print("det tog", antal_varv, "iterationer innan det blev kaprekars tal") antal_varv += 1

Problemet är att det nya talet jag får från tal = large - small inte vill hoppa in i nästa while loop. Vad gör jag för fel?

Redigerat in [code]-taggar //Mod
Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2011
Skrivet av Oliver32:

Har en uppgift som lyder.
Skriv ett program som givet ett ingångstal beräknar hur många iterationer det krävs innan ovanstående process kommer till 6174.
Utdata ska vara antalet iterationer som krävs för att genom ovanstående process komma fram till talet 6174 från det angivna talet.
Min kod:

tal = str(input("Vilket är ditt fyrsiffriga tal?"))
kapreker = 6174
antal_varv=0
while tal != kapreker:
if tal != kapreker:
n = tal
sorted(n)
sorted(n, reverse=True)
large = int("".join(sorted(n, reverse=True)))
small = int("".join(sorted(n)))
tal = large - small
else:
print("det tog", antal_varv, "iterationer innan det blev kaprekars tal")

antal_varv += 1

Problemet är att det nya talet jag får från tal = large - small inte vill hoppa in i nästa while loop. Vad gör jag för fel?

Jag är inte hundra på att jag förstår varken vad uppgiften är eller vad du försöker göra. För det första kör inte din kod om man slänger in det i en fil så det är lite svårt att återskapa det du beskriver; men:

Din while loop kollar att tal är skiljt från kapreker. Sen har du en ifsats som kollar precis samma sak. Du kommer alltså aldrig hamna i din else-sats eftersom du bara når if/else-statementet när if-satsen är sann.

Eftersom du inte har klippt med vad "ovanstående process" är för något så är det väldigt svårt att ge mer konstruktiv feedback. Måhända är det relaterat till Kaprekars nummer, men jag ser inte hur.

Linux: the operating system with a CLUE; Command Line User Environment.

GNU/Linux

Trädvy Permalänk
Proffsmoddare
Registrerad
Jun 2004

Gjorde den här kodsnutten till nån för ett bra tag sen med samma uppgift, har för mig att den funkade ordentligt så det kanske hjälper dig med.

n = input("n: ") iter = 0 while True: large = int( "".join(sorted(str(n).zfill(4), reverse = True))) small = int( "".join(sorted(str(n).zfill(4)))) n = int(large)-int(small) if n == 0: print ("n är noll") break if n == 6174: print (str(n) + " i " + str(iter) + " iterationer") break iter += 1

"Computer games don't affect kids, I mean if PacMan affected us as kids, we'd all be running around in darkened rooms, munching pills and listening to repetitive music." - Kristian Wilson, Nintendo 1989

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av GLaDER:

Jag är inte hundra på att jag förstår varken vad uppgiften är eller vad du försöker göra. För det första kör inte din kod om man slänger in det i en fil så det är lite svårt att återskapa det du beskriver; men:

Din while loop kollar att tal är skiljt från kapreker. Sen har du en ifsats som kollar precis samma sak. Du kommer alltså aldrig hamna i din else-sats eftersom du bara når if/else-statementet när if-satsen är sann.

Eftersom du inte har klippt med vad "ovanstående process" är för något så är det väldigt svårt att ge mer konstruktiv feedback. Måhända är det relaterat till Kaprekars nummer, men jag ser inte hur.

Såhär ser frågan ut
Välj ett fyrsiffrigt tal där de fyra siffrorna inte alla är likadana (t.ex 8082). Om man ordnar siffrorna från den största till den minsta så får vi ett nytt tal a (i detta fall 8820). Ordna sedan siffrorna från den minsta till den största så får vi ett annat tal b (i detta fall 0288). Beräkna nu differensen c=a−b=8820−0288=8532. Vi gör samma sak en gång till med det nya talet:
8532−2358=6174
Det märkliga är att denna process alltid kommer till 6174 förr eller senare. Om vi fortsätter får vi nämligen:
7641−1467=6174
Uppgiften består i att skriva ett program som givet ett ingångstal beräknar hur många iterationer det krävs innan ovanstående process kommer till 6174.
Indata består av ett fyrsiffrigt tal. Utdata ska vara antalet iterationer som krävs för att genom ovanstående process komma fram till talet 6174 från det angivna talet.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av SleepstreameR:

Gjorde den här kodsnutten till nån för ett bra tag sen med samma uppgift, har för mig att den funkade ordentligt så det kanske hjälper dig med.

n = input("n: ") iter = 0 while True: large = int( "".join(sorted(str(n).zfill(4), reverse = True))) small = int( "".join(sorted(str(n).zfill(4)))) n = int(large)-int(small) if n == 0: print ("n är noll") break if n == 6174: print (str(n) + " i " + str(iter) + " iterationer") break iter += 1

Tack för hjälpen men är så grymt nära att lösa det så vill gärna göra det med min egna kod

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008

@Oliver32: Det vore lättare för oss att läsa din kod om den stod inom code-taggar:

[code]
kod
[/code]

då får du en fin ruta där det ser ut exakt som din kod var inmatad.

kod

Var noga med indenteringen så att det stämmer med det du försöker köra.

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011
Skrivet av Oliver32:

Tack för hjälpen men är så grymt nära att lösa det så vill gärna göra det med min egna kod

Skickades från m.sweclockers.com

Om du fortfarande har problem, editera första inlägget så koden inklusive indentering är exakt som det står i din fil.

Lösning av samma problemet fast i Ruby som gör det möjligt att fråga all tal som är giltiga som startvärde hur många iterationer det tar att nå Kaprekers tal. Något som är möjligt i Ruby då man kan lägga till metoder till redan definierade klasser!

kapreker.rb

class Fixnum def kapreker? self == 6174 end def kapreker_seed? self.to_s.length <= 4 && self.to_4vec.uniq.length > 1 end def kapreker_seq if not self.kapreker_seed? raise "Must be a number between 1 and 9998 where not all digits are the same" end num = self seq = [num] while not num.kapreker? small = num.to_4vec.sort large = small.reverse num = large.join.to_i - small.join.to_i seq.push(num) end seq end def kapreker kapreker_seq.length - 1 end protected def to_4vec self.to_s.rjust(4, "0").split(//) end end

Dold text

Exempelkörning

$ irb irb(main):001:0> require './kapreker' => true irb(main):002:0> 123.kapreker? => false irb(main):003:0> 123.kapreker_seq => [123, 3087, 8352, 6174] irb(main):004:0> 123.kapreker => 3 irb(main):005:0> 6174.kapreker? => true

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008
Skrivet av Oliver32:

Problemet är att det nya talet jag får från tal = large - small inte vill hoppa in i nästa while loop. Vad gör jag för fel?

Variabeln tal som du läser in konverterar du till string, men tal som räknar ut kommer vara en int. Kan det ställa till det för dig?
Fundera även på när det kan vara lämpligt att uppdatera antal_varv.

Trädvy Permalänk
Medlem
Registrerad
Maj 2012

Lyckades lösa det tack för hjälpen!

Skickades från m.sweclockers.com