function Kaprekarzahl() { var factor = new Array(); var factor1 = new Array(); var factor2 = new Array(); var quadrat = new Array(); var summe = new Array(); var output = "" ; var anzkap = 0 ; var start0 = document.kform.kinput.value ; if (isNaN(start0) == true || start0 < 1) { alert("Eingabefehler im Feld Startzahl!") ; return ; } var nnumbers = document.kform.knnumbers.value ; if (isNaN(nnumbers) == true || nnumbers < 1) { alert("Eingabefehler im n-max!"); return ; } document.kform.kresult.value = output ; nnsteps = parseInt (nnumbers) ; nlen = start0.length ; for (i=0 ; i < nlen ; i++) { factor[i] = parseInt (start0.slice(nlen-1-i,nlen-i)) ; } // ziff[0] -> Einerziffer for (isteps=0 ; isteps < nnsteps ; isteps++) { for (i=0 ; i < nlen*2 ; i++) { quadrat[i] = 0 ; } for (i=0 ; i < nlen ; i++) { ziff = factor[i] ; ueb = 0 ; for (j=0 ; j < nlen ; j++) { prod = factor[j] * ziff + ueb + quadrat[j+i] ; einer = prod % 10 ; quadrat[j+i] = einer ; ueb = (prod - einer) / 10 ; } quadrat[nlen+i] = ueb ; // Quadratzahl der Laenge nlen*2 } // quadrat[0] -> Einerziffer var iog = nlen*2-1 ; var kaprekar = true ; // Kaprekarzahl wird vermutet for (cut=0 ; cut < iog ; cut++) { // Schnitt zwischen 0 und 1 und dann nach links kaprekar = true ; // Kaprekarzahl wird vermutet if (cut < nlen) { ismlug = 0 ; ismlog = cut ; // Grenz-Indizes des kleineren (sml) ibigug = cut + 1 ; ibigog = iog ; // bzw. groesseren (big) Bereichs } else { ismlug = cut + 1 ; ismlog = iog ; ibigug = 0 ; ibigog = cut ; } for (i=ibigug+nlen ; i <= ibigog ; i++) { // Summe zu gross? if (quadrat[i] > 0) kaprekar = false ; } if (!kaprekar) continue ; // ... zum naechsten cut for (i=0 ; i < nlen ; i++) { summe[i] = 0 ; } // Auf summe wird der kleine j = 0 ; // Bereich (mit fuehrenden Nullen) gespeichert for (i=ismlug ; i <= ismlog ; i++) { summe[j++] = quadrat[i] ; } ueb = 0 ; j = 0 ; for (i=ibigug ; i <= ibigug+nlen-1 ; i++) { sum = summe[j] + quadrat[i] + ueb ; einer = sum % 10 ; if (einer != factor[j]) { kaprekar = false ; break ; } summe[j++] = einer ; // ... wohl nicht noetig, j++ genuegt ueb = (sum - einer) / 10 ; } if (ueb > 0) kaprekar = false ; if (!kaprekar) continue ; // ... zum naechsten cut kaprekar = false ; // ... obwohl Kaprekar-Zahl vermutet werden darf, for (i=0 ; i <= cut ; i++) { // ... steht der Test auf "rechte Nullen" noch aus if (quadrat[i] != 0) kaprekar = true ; // ... eine Ziffer !0 Null, also } // ... Kaprekar-Zahl if (kaprekar) { var factor1 = new Array(); var factor2 = new Array(); factor.reverse() ; for (i=0 ; i <= cut ; i++) { factor2[i] = quadrat[i] ; } j = 0 ; for (i=cut+1 ; i <= iog ; i++) { factor1[j++] = quadrat[i] ; } quadrat.reverse() ; factor1.reverse() ; factor2.reverse() ; output += factor.join("") + " ist eine Kaprekar-Zahl:\n" + factor.join("") + " * " + factor.join("") + " = " + quadrat.join("") + " ---\> " + factor1.join("") + " + " + factor2.join("") + " = " + factor.join("") + "\n" ; document.kform.kresult.value = output ; factor.reverse() ; anzkap++ ; break ; } } // for cut=0 ... ueb = 1 ; // Uebergang zur naechsten Zahl for (i=0 ; i < nlen ; i++) { sum = factor[i] + ueb ; einer = sum % 10 ; factor[i] = einer ; ueb = (sum - einer) / 10 ; } if (ueb > 0) { factor[nlen++] = ueb ; } } // for isteps if (anzkap == 0) output = "Im untersuchten Bereich gibt " + "es keine Kaprekar-Zahlen!"; else if (anzkap == 1) { output += "\nIm untersuchten Bereich wurde " + "eine Kaprekar-Zahl gefunden!"; } else { output += "\nIm untersuchten Bereich wurden " + anzkap + " Kaprekar-Zahlen gefunden!"; } document.kform.kresult.value = output ; }