Numbers which are the cube roots of the product of their proper divisors: Difference between revisions

m
Minor update to Forth code
(Created Nim solution.)
m (Minor update to Forth code)
 
(8 intermediate revisions by 8 users not shown)
Line 99:
190 195 222 230 231 232 238 246 248 250
255 258 266 273 282 285 286 290 296 297
500th: 2526
5000th: 23118
50000th: 223735
</pre>
 
=={{header|ALGOL W}}==
{{Trans|ALGOL 68}}
<syntaxhighlight lang="algolw">
begin % find some numbers which are the cube roots of the product of their %
% proper divisors %
% the Online Encyclopedia of Integer Sequences states that these %
% numbers are 1 and those with eight divisors %
% NB: numbers with 8 divisors have 7 proper divisors %
 
integer MAX_NUMBER; % maximum number we will consider %
MAX_NUMBER := 500000;
 
begin
% form a table of proper divisor counts - pretend the pdc of 1 is 7 %
integer array pdc ( 1 :: MAX_NUMBER );
integer nextToShow, cCount;
for i := 1 until MAX_NUMBER do pdc( i ) := 1;
pdc( 1 ) := 7;
for i := 2 until MAX_NUMBER do begin
for j := i + i step i until MAX_NUMBER do pdc( j ) := pdc( j ) + 1
end;
% show the numbers which are the cube root of their proper divisor %
% product - equivalent to finding the numbers with a proper divisor %
% count of 7 ( we have "cheated" and set the pdc of 1 to 7 ) %
nextToShow := 500;
cCount := 0;
for n := 1 until MAX_NUMBER do begin
if pdc( n ) = 7 then begin
% found a suitable number %
cCount := cCount + 1;
if cCount <= 50 then begin
writeon( i_w := 3, s_w := 0, " ", n );
if cCount rem 10 = 0 then write()
end
else if cCount = nextToShow then begin
write( i_w := 9, s_w := 0, cCount, "th: ", i_w := 1, n );
nextToShow := nextToShow * 10
end if_various_cCount_values
end if_pdc_n_eq_7
end for_m
end
end.
</syntaxhighlight>
{{out}}
<pre>
1 24 30 40 42 54 56 66 70 78
88 102 104 105 110 114 128 130 135 136
138 152 154 165 170 174 182 184 186 189
190 195 222 230 231 232 238 246 248 250
255 258 266 273 282 285 286 290 296 297
 
500th: 2526
5000th: 23118
Line 246 ⟶ 302:
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">100 limite = 500000
110 dim pdc(limite)
120 for i = 1 to ubound(pdc)
130 pdc(i) = 1
140 next i
150 pdc(1) = 7
160 for i = 2 to ubound(pdc)
170 for j = i+i to ubound(pdc) step i
180 pdc(j) = pdc(j)+1
190 next j
200 next i
210 n5 = 500
220 cnt = 0
230 print "First 50 numbers which are the cube roots"
240 print "of the products of their proper divisors:"
250 for i = 1 to ubound(pdc)
260 if pdc(i) = 7 then
270 cnt = cnt+1
280 if cnt <= 50 then
290 print using "####";i;
300 if cnt mod 10 = 0 then print
310 else
320 if cnt = n5 then
321 print
330 print using "#########";cnt;
335 print "th: "; i;
340 n5 = n5*10
350 endif
360 endif
370 endif
380 next i
385 print
390 end</syntaxhighlight>
{{out}}
<pre>Similar to FreeBASIC entry.</pre>
 
==={{header|True BASIC}}===
Line 599 ⟶ 693:
</pre>
 
 
=={{header|EasyLang}}==
{{trans|Lua}}
<syntaxhighlight lang=easylang>
func has8divs n .
if n = 1
return 1
.
cnt = 2
sqr = sqrt n
for d = 2 to sqr
if n mod d = 0
cnt += 1
if d <> sqr
cnt += 1
.
if cnt > 8
return 0
.
.
.
if cnt = 8
return 1
.
return 0
.
while count < 50
x += 1
if has8divs x = 1
write x & " "
count += 1
.
.
while count < 50000
x += 1
if has8divs x = 1
count += 1
if count = 500 or count = 5000 or count = 50000
print count & "th: " & x
.
.
.
</syntaxhighlight>
 
=={{header|Factor}}==
Line 671 ⟶ 808:
{{trans|FreeBASIC}}
<syntaxhighlight lang="forth"h>500000 constant limit
variablecreate pdc limit cells allot
 
: main
Line 855 ⟶ 992:
49999{N
223735</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
public final class NumbersCubeRootProductProperDivisors {
 
public static void main(String[] aArgs) {
System.out.println("The first 50 numbers which are the cube roots"
+ " of the products of their proper divisors:");
for ( int n = 1, count = 0; count < 50_000; n++ ) {
if ( n == 1 || divisorCount(n) == 8 ) {
count += 1;
if ( count <= 50 ) {
System.out.print(String.format("%4d%s", n, ( count % 10 == 0 ? "\n" : "") ));
} else if ( count == 500 || count == 5_000 || count == 50_000 ) {
System.out.println(String.format("%6d%s%d", count, "th: ", n));
}
}
}
}
private static int divisorCount(int aN) {
int result = 1;
while ( ( aN & 1 ) == 0 ) {
result += 1;
aN >>= 1;
}
for ( int p = 3; p * p <= aN; p += 2 ) {
int count = 1;
while ( aN % p == 0 ) {
count += 1;
aN /= p;
}
result *= count;
}
if ( aN > 1 ) {
result *= 2;
}
return result;
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
The first 50 numbers which are the cube roots of the products of their proper divisors:
1 24 30 40 42 54 56 66 70 78
88 102 104 105 110 114 128 130 135 136
138 152 154 165 170 174 182 184 186 189
190 195 222 230 231 232 238 246 248 250
255 258 266 273 282 285 286 290 296 297
500th: 2526
5000th: 23118
50000th: 223735
</pre>
 
=={{header|Julia}}==
Line 1,017 ⟶ 1,210:
5,000th: 23118
50,000th: 223735</pre>
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">
croot_prod_prop_divisors(n):=block([i:1,count:0,result:[]],
while count<n do (if apply("*",rest(listify(divisors(i)),-1))=i^3 then (result:endcons(i,result),count:count+1),i:i+1),
result)$
 
/* Test cases */
croot_prod_prop_divisors(50);
 
last(croot_prod_prop_divisors(500));
 
last(croot_prod_prop_divisors(5000));
</syntaxhighlight>
{{out}}
<pre>
[1,24,30,40,42,54,56,66,70,78,88,102,104,105,110,114,128,130,135,136,138,152,154,165,170,174,182,184,186,189,190,195,222,230,231,232,238,246,248,250,255,258,266,273,282,285,286,290,296,297]
 
2526
 
23118
</pre>
 
=={{header|Nim}}==
Line 1,701 ⟶ 1,916:
 
Fifty thousandth: 223,735</pre>
=={{header|RPL}}==
<code>PRODIV</code> is defined at [[Product of divisors#RPL|Product of divisors]]
{{works with|Halcyon Calc|4.2.7}}
≪ DUP <span style="color:blue">PRODIV</span> OVER / SWAP DUP DUP * * == ≫ '<span style="color:blue">OK?</span>' STO
 
≪ { } 0 '''WHILE''' OVER SIZE 50 < '''REPEAT''' 1 + '''IF''' DUP <span style="color:blue">OK?</span> '''THEN''' SWAP OVER + SWAP '''END END''' ≫ EVAL
≪ 0 0 '''WHILE''' OVER 4 PICK < '''REPEAT''' 1 + '''IF''' DUP <span style="color:blue">OK?</span> '''THEN''' SWAP 1 + SWAP '''END END''' ≫ '<span style="color:blue">TASK</span>' STO
500 <span style="color:blue">TASK</span>
5000 <span style="color:blue">TASK</span>
{{out}}
<pre>
3: { 1 24 30 40 42 54 56 66 70 78 88 102 104 105 110 114 128 130 135 136 138 152 154 165 170 174 182 184 186 189 190 195 222 230 231 232 238 246 248 250 255 258 266 273 282 285 286 290 296 297 }
2: 2526
1: 23118
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby" line>require 'prime'
Line 1,717 ⟶ 1,948:
5000th: 23118
50000th: 223735
</pre>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby" line>say ("First 50 terms: ", 50.by { .proper_divisors.prod == .cube }.join(' '))
 
for n in (5e2, 5e3, 5e4) {
say "#{'%6s'%n.commify}th term: #{n.th{ .proper_divisors.prod == .cube }}"
}</syntaxhighlight>
{{out}}
<pre>
First 50 terms: 1 24 30 40 42 54 56 66 70 78 88 102 104 105 110 114 128 130 135 136 138 152 154 165 170 174 182 184 186 189 190 195 222 230 231 232 238 246 248 250 255 258 266 273 282 285 286 290 296 297
500th term: 2526
5,000th term: 23118
50,000th term: 223735
</pre>
 
Line 1,760 ⟶ 2,005:
{{libheader|Wren-long}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="ecmascriptwren">import "./math" for Int, Nums
import "./long" for ULong, ULongs
import "./fmt" for Fmt
Line 1,804 ⟶ 2,049:
</pre>
Alternatively and a bit quicker, inspired by the C++ entry and the OEIS comment that (apart from 1) n must have exactly 8 divisors:
<syntaxhighlight lang="ecmascriptwren">import "./fmt" for Fmt
 
var divisorCount = Fn.new { |n|
1,777

edits