Thread Kaprekar-Zahl (7 answers)
Opened by Dominik at 2017-12-14 19:25

foobar12345
 2017-12-14 20:25
#187737 #187737
User since
2011-07-20
20 Artikel
BenutzerIn
[default_avatar]
nimm einfach den js-code aus der website und schreib ihn in perl neu hin
??? ;)


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 ;
}

View full thread Kaprekar-Zahl