individuelle Zahl x mal erneut um 1 erhöhen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
zypral
User
Beiträge: 3
Registriert: Samstag 30. August 2008, 02:02

Erstmal einen "guten Morgen",

nachdem ich mich mittlerweile die halbe Nacht durch's Internet gewühlt habe, bitte ich euch um die Lösung für ein, für euch sicherlich triviales, Problem.

Der Benutzer soll in meinem Skript 2 Eingaben tätigen, Zahl und Anzahl der Erhöhungen.

Beispiel:
Zahl = 150
Anzahl der Erhöhungen = 4

Python soll nun folgende Berechnung durchführen (und genau da hapert es bei mir):
150 + 151 + 152 + 153
oder
(150) + (150 + 1) + (150 + 2) + (150 + 3)

Allerdings fehlt mir dazu jeglicher Ansatz um dies zu erreichen. Das "Problem" ist ja auch, dass anstatt der 150 und der 4 auch jede beliebige andere Zahl genommen werden kann / soll.

Bei der Eingabe von 327 und 9 sollte dann
327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335
oder
(327) + (327 + 1) + (327 +2) + (327 + 3) + (327+ 4) + (327 + 5) + (327 + 6) + (327 + 7) + (327 + 8)
berechnet werden.

Ich hoffe ich konnte erklären woran es bei mir hapert und was ich erreichen möchte.

Es wäre schön, wenn ihr mir sagen könntet wie das Skript an dieser Stelle zu schreiben ist oder ihr mir auch nur einen Link gibt, wo im Idealfall genau dieses behandelt wird.

PS: Das bei der Anzahl der Erhöhung 4 und 9 eigentlich nur 3 bzw. 8 mal erhöht wird ist mir bewusst und passt auch so. ;-)

LG
zypral
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hallo, willkommen im Forum!
zypral hat geschrieben:nachdem ich mich mittlerweile die halbe Nacht durch's Internet gewühlt habe, bitte ich euch um die Lösung für ein, für euch sicherlich triviales, Problem.
Ja, ist trivial und du hättest es einfach haben können: Lesen im Tutorial, ein paar Seiten, dann verstehen und Problem selbst lösen.

Es gibt eine ganz einfache, kurze Lösung, ein einziger Ausdruck, fertig.
Aber den verrate ich dir nicht, denn vermutlich möchte dein Lehrer, dass ihr euch Gedanken über einen Algorithmus macht und deine Schwierigkeiten damit zeigen, dass das auch nötig ist.

Lösungsidee:
Du beginnst mit einer Zahl a (z.B.150) und erhöhst sie n-mal (z.B. 4). Dazu verwendest du sinnvollerweise eine Schleife. Als Zwischenschritt zur endgültigen Lösung könntest du zunächst ein Miniprogramm schreiben, dass den Anwender zur Eingabe von a und n auffordert und dann die Zahlen a, a+1, a+2 etc. einfach nur ausgibt. Wenn du das geschafft hast, dann könntest du dir Gedanken machen - und evtl. nochmal nachfragen - wie man diese Zahlen dann addieren kann.
BlackJack

Code: Alles auswählen

from itertools import count, izip, repeat
from operator import add


def main():
    print reduce(add,
                 (a + b
                  for a, b in izip(repeat(input('Zahl: '),
                                          input('Wiederholungen: ')), count())),
                 0)
SCNR :twisted:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

int(raw_input()), niemals input() ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

from itertools import chain, izip, repeat, count
from functional import compose
import operator as op

ask_int = compose(int, raw_input)


print sum(chain(
        *izip(
            repeat(ask_int('Zahl: '), ask_int('Wiederholungen: ')), count())))

für compose:
http://audaxxx.de/functional-0.2.tar.gz

;)
Zuletzt geändert von audax am Samstag 30. August 2008, 09:46, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Na mit raw_input funktioniert BlackJack Ausdruck nicht, denn er braucht ja int-Objekte und keine Strings. Das input() war sicherlich schon mit Bedacht gewählt.

Stefan

PS: Die Summer von X bis X + N zu berechnen ist wie die Summe von 0 bis N-1 plus N * X zu berechnen und der gute Gauß wusste schon, wie man diese Summe in einer geschlossenen Formel angeben kann.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

sma hat geschrieben:Na mit raw_input funktioniert BlackJack Ausdruck nicht, denn er braucht ja int-Objekte und keine Strings. Das input() war sicherlich schon mit Bedacht gewählt.
Das glaube ich nicht, Tim.

int(raw_input("Foo")) ist, was man nutzen sollte, niemals raw_input.
Zahl: __import__("os").remove(__import__("sys").argv[0])
zypral
User
Beiträge: 3
Registriert: Samstag 30. August 2008, 02:02

Ich danke euch. Zwar verstehe ich das meiste von eurem Code noch nicht, aber ich werde mich da schon reinfuchsen. Aber ich weiss jetzt wenigstens wo ich ansetzen muss.

@ numerix

Bei mir gibt es keinen Lehrer, diese Zeiten sind bei mir schon einige Jahre her. ;-)
Ich bringe mir Python in meiner Freizeit aus reinem Interesse selbst bei (bisherige Programmiererfahrung = 0). Deshalb habe ich auch keinen Ansatz dafür gefunden, da es meine aktuellen Kenntnisse doch noch ein ganzes Stück übersteigt. :?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Versuchs nicht sondern bediene dich deiner mathematischen Kenntnisse ;)

Unser Code ist nicht ganz ernst gemeint. Er funktioniert zwar, ist aber ein bischen arg weit fortgeschritten für dich :D
zypral
User
Beiträge: 3
Registriert: Samstag 30. August 2008, 02:02

So klappt es, aber gibt es dabei noch etwas zu verbessern?

Code: Alles auswählen

exist = input("Vorhanden: ")
needed = input("Benoetigt: ")

a = 0
list = []
for i in range (needed):
    a1 = exist + a
    exist, a = a1, 1
    list.append(a1)
print sum(list)
Um auf meinen Eingangspost zurückzukommen:
Als "Vorhanden" wird z.B. 150 und als "Benoetigt" z.B. 4 eingetragen.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

man kann das ganze auch so machen:

Code: Alles auswählen

# eine endlosschleife starten
while True:
  try:
    x = int(raw_input("Zahl: "))
    n = int(raw_input("Wie oft? "))
  except ValueError: continue  # wenn keine zahlen eingegeben wurden, schleife neu starten -> neu fragen
  break  # wenn man bis hier hin gekommen ist (eingaben sind gueltige zahlen), schleife abbrechen

y = x  # eine kopie von x erzeugen

# jetzt eine schleife starten, die n mal ablaeuft
# dazu eine liste mit n zahlen erzeugen, bei der bei jedem schleifendurchlauf
# ein eintrag aus der zahlen-liste in i gespeichert wird
for i in xrange(1, n):
  y += x+i  # y mit x+i addieren

print y  # das endergebnis ausgeben
such dir aus, was dir am besten gefaellt. :)

mfg
roschi

PS: Es wurde hier schon so oft gesagt: Nimm kein 'input()' wenn es nicht unbedingt notwendig ist! das kann eine grosse sicherheitsluecke im programm sein, weil das, was du da reinschreibst, ausgefuehrt wird. 'int(raw_input())' konvertiert dir die eingaben genau so in integer.
Zuletzt geändert von roschi am Samstag 30. August 2008, 15:11, insgesamt 1-mal geändert.
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Außer dem schon erwähnten raw_input ist es ein bisschen kompliziert. Wozu hast du denn i, wenn du es nicht benutzt?

Code: Alles auswählen

exist = int(raw_input("Vorhanden: "))
needed = int(raw_input("Benoetigt: "))

liste = [] # Du solltest es vermeiden vorgegebenen Namen wie list zu überschreiben
for i in range (needed):
    liste.append( exist + i )
print sum(liste)
@roschi

Code: Alles auswählen

y = x
Erzeugt keine Kopie von x.

Code: Alles auswählen

In [18]: x = 23

In [19]: y = x

In [20]: y is x

Out[20]: True
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

a= int(raw_input("Vorhanden: "))
b= int(raw_input("Benoetigt: "))

print sum(range(a, a+b))
Zuletzt geändert von EyDu am Samstag 30. August 2008, 15:15, insgesamt 1-mal geändert.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

@Darii:
ja, sorry, das war etwas falsch ausgedrueckt.
ich meinte, dass 'y = x' den wert aus x in y schreibt.

mfg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

OEHM, ja!
so gehts natuerlich auch ^^

mfg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Vergiss dass es input gibt, list ist ein Built-in dass du nicht überschreiben willst/solltest.
Statt range nimm doch gleich xrange welches einen Iterator zurückliefert, dass ist schneller und solange du die Liste nicht brauchst imho die bessere Lösung.

Desweiteren ist `a` und Zeile 8 völlig überflüssig.

EDIT: Mist zu spät :shock:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ach mist, da habe ich wieder die offensichtliche Lösung vergessen:

Code: Alles auswählen

(lambda f, b, x: f(f,b,x))(lambda f, b, x: x and b+x+f(f, b, x-1)-1, int(raw_input("base:")), int(raw_input("x:")))
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Und noch eine.. ;)

Code: Alles auswählen

a = int(raw_input())
b = int(raw_input())
c = b-1
print a*b+ (c+1)*(c/2)+(c%2*((c/2)+1))
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Hab' auch noch einen...

Code: Alles auswählen

def adder(a, i, acc=()):

  if i >= 0:
    return adder(a, i-1, acc=((a, i),) + acc)
  else:
    return acc

a = int(raw_input('a? '))
i = int(raw_input('i? '))
print sum(a + i for a, i in adder(a, i-1))
:wink:
yipyip
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Warum benutzt eigentlich niemand einen Generator?

Code: Alles auswählen

def calc(x, y):
    while y:
        y -= 1
        yield x + y

x = int(raw_input('x := '))
y = int(raw_input('y := '))

print sum(calc(x, y))
Antworten