The C++-Programming Language ist ein gutes Buch, das allerdings gute Programmierkenntnisse voraussetzt.
Es ist KEIN Einsteigerbuch für werdende Programmierer, sondern vermittelt die zum Zeitpunkt des Erscheinens relevanten Möglichkeiten des Standards der Sprache.
Mein Tipp zum Programmierenlernen:
Suche dir konkrete Probleme (bspw. Standardalgorithmen aus einem Algorithmenbuch) und implementiere sie in jeder Programmiersprache, die du erlernen willst.
Variiere dabei auch den Stil (objektorientiert oder funktional, rekursiv oder iterativ etc.) und versuche immer wieder neue Dinge dazuzulernen oder auszuprobieren. (Ein- und Ausgabe von Dateien; GUI-Programmierung etc.)
Noch eine persönliche Meinung:
C/C++ ist nichts für "kleine Kinder".
Insbesondere Python ist viel anfängerfreundlicher.
2021-03-01 00:31 - JamesNguyen in Beitrag No. 2 schreibt:
Vielen Dank für den guten Vorschlag.
Was meinst du aber damit dass man sich zunutze machen
kann dass es sich um eine FLießkommazahl vorliegen hat?
Die Wurzel einer Fließkommazahl mit geradem Exponenten ist gleich der Wurzel aus der Mantisse mit halbem Exponenten.
Der eigentlich Wurzelalgorithmus muss daher nur den (um eine Potenz erweiterten) Bereich der Mantisse abdecken.
Diesen sehr kleinen Bereich (binär dann bspw. $[1;4)$, dezimal $[1;100)$) kann man dann mit Heron, Taylorreihe oder Interpolationspolynomen beliebig genau abdecken.
Wie wäre es, wenn du nach jeder Iteration schaust, ob sich die Lösung verbessert hat?
Ansonsten stellt sich natürlich die Frage, warum man das Ganze eigentlich so detailliert implementieren will und dann trotzdem ein naives Heronverfahren nutzt, statt sich die Tatsache zunutze zu machen, dass man eine Fließkommazahl vorliegen hat.
bestNumCoins ist ein Array von 0 bis m.
Für jeden Wert wird die minimale Anzahl Münzen gespeichert.
Am Ende sieht es (zurückgegeben) wie folgt aus:
[0, 1, 2, 3, 4, 1, 2, 3, 1, 2, 2]
Es sind 0 Münzen notwendig, um 0 zu wechseln.
Es ist 1 Münze notwendig, um 1 zu wechseln.
...
Es sind 3 Münzen notwendig, um 7 zu wechseln.
...
Es sind 2 Münzen notwendig, um 10 zu wechseln.
Für jeden Wert und jede Münzsorte ist eine Lösung gleich der besten Lösung für Wert minus Münzsorte plus 1.
Falls diese Lösung besser ist als die bekannte, wird sie gespeichert.
Zu Beginn setzt man alle Lösungen außer für die 0 auf Unendlich bzw. einen unerreichbar hohen Wert.
Dein Code macht allerdings etwas anderes als die Vorschläge aus dem obigen Post.
Meine Lösung findet bspw. auch [1,3] in [1,2,3].
Ob das gewünscht oder unerwünscht ist, musst du wissen.
Noch Vorschläge für deinen Code, die ohne Strings auskommen:
Python
# Find starting indeces of short in long# e.g.: findSubsequence([2,3],[1,2,3,4,2,3]) -> [1,4]def findSubsequence(short,long):
states =[(0,0)]
indices =[]for i inrange(len(long)):
_states =[]for j,k in states:
iflong[i]== short[k]:
if k ==len(short)-1:
indices.append(j)else:
_states.append((j,k+1))
_states.append((i+1,0))
states = _states
return indices
def findSubsequenceNaive(short,long):
indices =[]for i inrange(len(long)-len(short)+1):
ifall(long[i+j]==short[j]for j inrange(len(short))):
indices.append(i)return indices
def hasSubsequenceNaive(short,long):
returnany(all(long[i+j]==short[j] \
for j inrange(len(short))) \
for i inrange(len(long)-len(short)+1))fromrandomimport randint
def buildTestData(n,k,r):
long=[randint(1,r)for i inrange(n)]
short =[randint(1,r)for i inrange(k)]return short,longfromtimeitimporttimeit
short,long= buildTestData(10000,10,2)for f in[findSubsequenceNaive,hasSubsequenceNaive,findSubsequence]:
t=timeit(f"f(short,long)",globals=globals(),number=100)print(f"{f.__name__:20} took {t:.3f}s to calculate {f(short,long)}")
findSubsequenceNaive took 23.584s to calculate [1436,1472,3276,4921,5229,6539,7977,8191,8625,8689,8739]
hasSubsequenceNaive took 5.194s to calculate True
findSubsequence took 2.160s to calculate [1436,1472,3276,4921,5229,6539,7977,8191,8625,8689,8739]
Du kannst dir in Windows das Konsolenhandle geben lassen und dieses dann manipulieren.
Gefundenes Beispiel:
C
//// move_window.c - Move a console window to specific// screen coordinates.//// Written by Ted Burke - last modified 17-4-2012//// To compile: gcc -o move_window.exe move_window.c//#define WINVER 0x0500#include <windows.h>int main (void){// Get console window handle
HWND wh = GetConsoleWindow();// Move window to required position
MoveWindow(wh,100,100,640,250, TRUE);}
Hier noch zwei Vorschläge, die keinerlei "Magie" benötigen:
Python
def is_sub_sequence(short,long):
i,j =0,0while i <len(short):
if j >=len(long):
returnFalseif short[i]==long[j]:
i +=1
j +=1returnTruedef is_sub_sequence_iter(short,long):
long_iter =iter(long)for i in short:
b =Falsefor j in long_iter:
if i == j:
b =Truebreakifnot b:
returnFalsereturnTrue
ws.append([zä2]+langlist)# Hängt zä2 vor die langlist# ist etwas völlig anderes als das unsinnige
ws.append(zä2+langlist)# Versucht eine Liste zu einer Zahl zu addieren