У меня есть эта оригинальная функция C ++ под названием "s":
long s(long n) {
long sum = 0;
long m;
m = (long) sqrt(n);
for (long i = 2; i < m; i++)
if ((n % i) == 0) sum += (i + (n/i));
if (n>1) sum += 1;
if ((m*m) == n) sum += m;
return sum;
}
Я изо всех сил пытался преобразовать эту функцию в использование типа mpz GMP, чтобы она допускала произвольно длинные целые числа.
Это моя попытка:
void s(mpz_t n, mpz_t *final)
{
mpz_t sum;
mpz_t m;
mpz_t temp;
mpz_init (sum);
mpz_init (m);
mpz_init (temp);
mpz_set_str (sum, "0", 10);
mpz_sqrt(m, n);
for (mpz_t i, mpz_init(i), mpz_set_str(i, "2", 10); mpz_cmp(i,m)< 0; mpz_add_ui(i, i, 1))
{
mpz_mod(temp, n, i);
if (mpz_cmp_si(temp, 0) == 0)
{
// use divexact since we know they are divisable
mpz_divexact(temp, n, i);
mpz_add(temp, temp, i);
mpz_add(sum, sum, temp);
}
}
if (mpz_cmp_si(n, 1) > 0) mpz_add_ui(sum, sum, 1);
mpz_mul(temp, m, m);
if (mpz_cmp(temp, n) == 0) mpz_add(sum, sum, m);
final = sum;
}
С оригинальной программой можно ознакомиться здесь: http://pastebin.com/mf751592
Что я делаю не так? У меня изначально возникли проблемы, потому что я не мог вернуть тип mpz_t. Поэтому вместо этого я передал указатель на то, что я хочу, чтобы функция возвращала.
Я все еще борюсь с этим, хотя. Может ли кто-нибудь указать мне правильное направление?
Эта строка: for (mpz_t i, mpz_init(i), mpz_set_str(i, "2", 10); mpz_cmp(i,m)< 0; mpz_add_ui(i, i, 1))
Выдает эту ошибку: 23: ошибка: невозможно инициализировать массивы с использованием этого синтаксиса