Multiplicatively perfect numbers: Difference between revisions
→{{header|C}}: Optimized and extended to 5 million,
(→{{header|Wren}}: Optimized to enable 5 million to be reached in a reasonable time.) |
(→{{header|C}}: Optimized and extended to 5 million,) |
||
Line 101:
=={{header|C}}==
This includes '1' as an MPN. Run time around 3.2 seconds.
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdbool.h>
Line 121:
void divisors(int n, int *divs, int *length) {
int i, j, k = 1, c = 0;
if (n%2) k = 2;
Line 131 ⟶ 127:
if (!(n%i)) {
divs[c++] = i;
if (c > 3) break; // not eligible if has > 2 divisors
j = n / i;
if (j != i) divs[c++] = j;
Line 140 ⟶ 137:
int main() {
int i, d, j, k, t, length, prod;
int divs[
printf("Multiplicatively perfect numbers under %d:\n", limit);
setlocale(LC_NUMERIC, "");
for (i =
if (i != 1) {
divisors(i, divs, &length);
Line 150 ⟶ 147:
length = 2;
}
if (length
}
}
Line 166 ⟶ 159:
for (k = c; k * k * k < limit; k +=2 ) if (isPrime(k)) ++cubes;
t = count + squares - cubes - 1;
printf("Counts under %'
if (limit ==
s = j;
c = k;
Line 195 ⟶ 188:
469 471 473 478 481 482 485 489 493 497
Counts under 500: MPNs = 150 Semi-primes = 153
Counts under 5,000: MPNs = 1,354 Semi-primes = 1,365
Counts under 50,000: MPNs = 12,074 Semi-primes = 12,110
Counts under 500,000: MPNs = 108,223 Semi-primes = 108,326
Counts under 5,000,000: MPNs = 978,983 Semi-primes = 979,274
</pre>
|