1 2 3 4 5 6 7 8 9 10
for($a=1; $a=<800000; $a++){ $aquadrat=$a**2; $laenge=length($a); $testata=$aquadrat%(10**$laenge); $testatb=$aquadrat/(10**$laenge); $testatb=int($testatb); if($testata+$testatb==$aquadrat) {print "$a\n"} else {last}; }
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 ;
}
Quoteda steht nichts von einem festen Zerlegunsfaktor.Ein natürliche Zahl, deren Quadratzahl sich so in zwei Teile zerlegen lässt, dass deren Summe wieder die Originalzahl ergibt
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
#!/usr/bin/perl use strict; use warnings; for my $cnt (0..800000){ my $aquadrat=$cnt**2; my @parts = split('',$aquadrat); my $first = ''; while(@parts) { $first .= shift(@parts); last if($first >= $cnt); next unless $first; last unless @parts; my $last = join('',@parts); next unless $last; next if($last >= $cnt); if($first + $last == $cnt) { print "$cnt**2 => $aquadrat => $first + $last\n"; last; } } }