p0021_s0.c
problem 21 · 32 lines
/* Solution to Euler Problem 21: Amicable Numbers. */
#include "runner.h"
#include <math.h>
static long long sum_factors(int n) {
int n_sqrt = (int)sqrt((double)n);
long long total = 1;
for (int i = 2; i <= n_sqrt; i++) {
if (n % i == 0) {
total += i + n / i;
}
}
if (n_sqrt * n_sqrt == n) {
total -= n_sqrt;
}
return total;
}
const char *solve(int argc, char *argv[]) {
static char _answer[32];
int max_num = parse_int(argv[1]);
long long result = 0;
for (int x = 2; x <= max_num; x++) {
long long y = sum_factors(x);
if (y != x && sum_factors((int)y) == x) {
result += x;
}
}
{ snprintf(_answer, sizeof _answer, "%lld", (long long)(result)); return _answer; }
}