#include <iostream> #include <cassert> const int maxprime = 65536; int primes[maxprime]; int nprimes; void findPrimes() { std::cout << "Searching prime numbers ..." << std::endl; bool *sieve = new bool[maxprime+1]; int i; for (i=0;i<maxprime;i++) sieve[i] = 0; i = 2; nprimes = 0; while (1) { while (i<maxprime && sieve[i]) i++; if (i>=maxprime) break; primes[nprimes++] = i; for (int j=i*2; j<maxprime; j+=i) sieve[j] = 1; i++; } std::cout << nprimes << " primes found" << std::endl; delete sieve; } int sumDiv(int a) { int i, r=1, b=a; int *pr = primes; while (b > 1) { int p = *pr++, s = 1; if (p*p > b) return r * (b+1) - a; while (b % p == 0) { b /= p; s = s*p + 1; } r *= s; } return r; } int main() { findPrimes(); int cnt = 0; for (int a=1; ; a++) { int b = sumDiv(a); if (a < b && sumDiv(b) == a) { cnt++; std::cout << cnt << " (" << a << ", " << b << ")" << std::endl; if (cnt == 30) break; } } return 0; }
Standard input is empty
Searching prime numbers ... 6542 primes found 1 (220, 284) 2 (2620, 2924) 3 (5020, 5564) 4 (6232, 6368) 5 (10744, 10856) 6 (12285, 14595) 7 (17296, 18416) 8 (63020, 76084) 9 (66928, 66992) 10 (67095, 71145) 11 (69615, 87633) 12 (79750, 88730) 13 (100485, 124155) 14 (122265, 139815) 15 (122368, 123152) 16 (141664, 153176) 17 (142310, 168730) 18 (171856, 176336) 19 (176272, 180848) 20 (185368, 203432) 21 (196724, 202444) 22 (280540, 365084) 23 (308620, 389924) 24 (319550, 430402) 25 (356408, 399592) 26 (437456, 455344) 27 (469028, 486178) 28 (503056, 514736) 29 (522405, 525915) 30 (600392, 669688)