TI-Basic: Programme und Tutorials: Quersumme

Aus testwiki
Zur Navigation springen Zur Suche springen

Vorlage:Navigation hoch buch

Erstellt von: Peter Riedel
Schwierigkeitsgrad: fortgeschritten
Modell: Voyage 200

Quersumme

Vorlage:W

Bei folgenden Funktionen und Programmen ist es nicht nötig die Ziffernanzahl k der natürlichen Zahl n als zweites Argument zu übergeben, sondern wird intern mithilfe der Funktion numdigit(n,1) in Abhängigkeit von n automatisch berechnet. k wird im Quelltext also durch numdigit(n,1) ersetzt. Allerdings kann das häufige Aufrufen von Funktionen bei Zahlen mit vielen Stellen die Geschwindigkeit der Ausführung deutlich verringern. Daher sollte man bei rechenintensiven Anwendungen k mitübergeben, auch wenn das weniger komfortabel ist als nur ein Argument übergeben zu müssen.

numdigit(n,i)={numdigit(n,i+1),wenn nmod10i<ni,wenn nmod10i=n
:numdigit(n,i)
:Func
:While 10^i≤n
:©While mod(n,10^i)<n
:  i+1→i
:EndWhile
:Return i
:EndFunc
:numdigit(n,i)
:Func
:If 10^i≤n Then
:©If mod(n,10^i)<n Then
:  Return numdigit(n,i+1)
:Else
:  Return i
:EndIf
:EndFunc

Linksassoziativ

k Ziffern der natürlichen Zahl n werden von links nach rechts ziffernweise addiert, sodass man die Quersumme qs(n,k) von n erhält.

qs(n,k)=i=0k1nmod10kinmod10ki110ki1qs(n,k)=i=1knmod10ki+1nmod10ki10ki
n,k{0}

Funktion

:qs(n)
:Func
:If n<0 or mod(n,1)≠0
:  Return undef
:Return Σ((mod(n,10^(numdigit(n,1)-i))-mod(n,10^(numdigit(n,1)-i-1)))/10^(numdigit(n,1)-i-1),i,0,numdigit(n,1)-1)
:©Return Σ((mod(n,10^(numdigit(n,1)-i+1))-mod(n,10^(numdigit(n,1)-i)))/10^(numdigit(n,1)-i),i,1,numdigit(n,1))
:EndFunc

Programm

:qs(n)
:Prgm
:ClrIO
:If n<0 or mod(n,1)≠0 Then
:  Disp "Fehler: n ∈ N = {0,1,2,...,∞}"
:  Return
:EndIf
:numdigit(n,1)→i
:string(n)→n
:0→q
:0→k
:While k<i
:  k+1→k
:  expr(mid(n,k,1))→j
:  q+j→q
:EndWhile
:string(q)→q
:Disp "Quersumme: "&q
:EndPrgm

Rechtsassoziativ

k Ziffern der natürlichen Zahl n werden von rechts nach links ziffernweise addiert, sodass man die Quersumme qs(n,k) von n erhält.

qs(n,k)=i=0k1nmod10i+1nmod10i10iqs(n,k)=i=1knmod10inmod10i110i1
n,k{0}

Funktion

:qs(n)
:Func
:If n<0 or mod(n,1)≠0
:  Return undef
:Return Σ((mod(n,10^(i+1))-mod(n,10^i))/10^i,i,0,numdigit(n,1)-1)
:©Return Σ((mod(n,10^i)-mod(n,10^(i-1)))/10^(i-1),i,1,numdigit(n,1))
:EndFunc

Programm

:qs(n)
:Prgm
:ClrIO
:If n<0 or mod(n,1)≠0 Then
:  Disp "Fehler: n ∈ N = {0,1,2,...,∞}"
:  Return
:EndIf
:numdigit(n,1)→i
:string(n)→n
:0→q
:While i>0
:  expr(mid(n,i,1))→j
:  q+j→q
:  i-1→i
:EndWhile
:string(q)→q
:Disp "Quersumme: "&q
:EndPrgm

Iterative Quersumme

Vorlage:W

itqs(n,z)={0,wenn n=0z,wenn nmodz=0 und n0nmodz,wenn nmodz0
:itqs(n,z)
:Func
:If mod(n,z)≠0 Then
:  Return mod(n,z)
:ElseIf mod(n,z)=0 and n≠0 Then
:  Return z
:Else
:  Return 0
:EndIf
:EndFunc

Rekursion

itqs(n,k)={qs(n,k),wenn qs(n,k)<10itqs(qs(n,k),numdigit(qs(n,k),1)),wenn qs(n,k)10
n,k{0}

Funktion

:itqs(n)
:Func
:If qs(n)≥10 Then
:  Return itqs(qs(n))
:Else
:  Return qs(n)
:EndIf
:EndFunc

Programm

:itqs(n)
:Prgm
:ClrIO
:If n<0 or mod(n,1)≠0 Then
:  Disp "Error: n ∈ N = {0,1,2,...,∞}"
:  Return
:EndIf
:0→k
:While n>9
:  num(n,1)→i
:  string(n)→n
:  0→q
:  While i>0
:    expr(mid(n,i,1))→j
:    q+j→q
:    i-1→i
:  EndWhile
:  k+1→k
:  q→n
:EndWhile
:string(n)→n
:string(k)→k
:Disp "additive digital root: "&n,"additive persistence: "&k
:EndPrgm

Alternierende Quersumme

Vorlage:W

Linksassoziativ

k Ziffern der natürlichen Zahl n werden von links nach rechts ziffernweise abwechselnd addiert und subtrahiert, sodass man die alternierende Quersumme aqs(n,k) von n erhält.

aqs(n,k)=i=0k1nmod10kinmod10ki110ki1(1)iaqs(n,k)=i=1knmod10ki+1nmod10ki10ki(1)i1
n,k{0}

Funktion

:aqs(n)
:Func
:If n<0 or mod(n,1)≠0
:  Return undef
:Return Σ((mod(n,10^(numdigit(n,1)-i))-mod(n,10^(numdigit(n,1)-i-1)))/10^(numdigit(n,1)-i-1)*(-1)^i,i,0,numdigit(n,1)-1)
:©Return Σ((mod(n,10^(numdigit(n,1)-i+1))-mod(n,10^(numdigit(n,1)-i)))/10^(numdigit(n,1)-i)*(-1)^(i-1),i,1,numdigit(n,1))
:EndFunc

Programm

Rechtsassoziativ

k Ziffern der natürlichen Zahl n werden von rechts nach links ziffernweise abwechselnd addiert und subtrahiert, sodass man die alternierende Quersumme aqs(n,k) von n erhält.

aqs(n,k)=i=0k1nmod10i+1nmod10i10i(1)iaqs(n,k)=i=1knmod10inmod10i110i1(1)i1
n,k{0}

Funktion

:aqs(n)
:Func
:If n<0 or mod(n,1)≠0
:  Return undef
:Return Σ((mod(n,10^(i+1))-mod(n,10^i))/10^i*(-1)^i,i,0,numdigit(n,1)-1)
:©Return Σ((mod(n,10^i)-mod(n,10^(i-1)))/10^(i-1)*(-1)^(i-1),i,1,numdigit(n,1))
:EndFunc

Programm

Nichtalternierende t-Quersumme

Vorlage:W

Zahlenblöcke mit t Ziffern der natürlichen Zahl n mit k Ziffern werden von rechts nach links blockweise addiert, sodass man die t-Quersumme tqs(n,k,t) von n erhält.

tqs(n,k,t)=i=0k1tnmod10it+tnmod10it10it

Funktion

:tqs(n,t)
:Func
:If n<0 or mod(n,1)≠0 or t<1 or mod(t,1)≠0
:  Return undef
:Return Σ((mod(n,10^(i*t+t))-mod(n,10^(i*t)))/10^(i*t),i,0,(numdigit(n,1)-1)/t)
:©Return Σ((mod(n,10^(i*t))-mod(n,10^(i*t-t)))/10^(i*t-t),i,1,numdigit(n,1)/t+1)
:EndFunc

Alternierende t-Quersumme

Vorlage:W

Zahlenblöcke mit t Ziffern der natürlichen Zahl n mit k Ziffern werden von rechts nach links blockweise abwechselnd addiert und subtrahiert, sodass man die t-Quersumme tqs(n,k,t) von n erhält.

atqs(n,k,t)=i=0k1tnmod10it+tnmod10it10it(1)i

Funktion

:atqs(n,t)
:Func
:If n<0 or mod(n,1)≠0 or t<1 or mod(t,1)≠0
:  Return undef
:Return Σ((mod(n,10^(i*t+t))-mod(n,10^(i*t)))/10^(i*t)*(-1)^i,i,0,(numdigit(n,1)-1)/t)
:©Return Σ((mod(n,10^(i*t))-mod(n,10^(i*t-t)))/10^(i*t-t)*(-1)^(i-1),i,1,numdigit(n,1)/t+1)
:EndFunc