「s」と呼ばれるこの元の C++ 関数があります。
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;
}
この関数を GMP の mpz 型を使用するように変換して、任意の長さの整数を使用できるようにするのに苦労してきました。
これは私の試みです:
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: エラー: この構文を使用して配列を初期化できません