自然数 n (1 <= n <= 500000) が与えられた場合、すべての適切な約数の合計を出力してください。
定義: 自然数の適切な約数は、その数よりも厳密に小さい約数です。
たとえば、数値 20 には 1、2、4、5、10 の 5 つの適切な除数があり、除数の合計は 1 + 2 + 4 + 5 + 10 = 22 です。
入力
テスト ケースの数 (約 200000 に等しい) を示す整数と、1 ~ 500000 の範囲の 1 つの整数を含む多数の行が続きます。
出力
各行に 1 つの整数: それぞれ与えられた整数の除数の合計。
例
サンプル入力:
3
2
10
20
サンプル出力:
1
8
22
私のコードは次のとおりです。
/* @BEGIN_OF_SOURCE_CODE */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[])
{
int sum = 0,
cases = 0,
i, j, buff;
scanf("%d", &cases); //Number of tests
int *n;
n = (int*) malloc(cases * sizeof(int)); //Defining array for numbers to be tested///////
for (i = 0; i < cases; i++) {
scanf("%d", &n[i]);
}
for (i = 0; i < cases; i++ ) {
buff = n[i] / 2;
if (n[i] == 1) {
sum = -1;
}
if (!(n[i] & 1)) {
for (j = 2; j < buff; j++) {
if (n[i] % j == 0) {
sum += n[i] / j + j;
buff /= j;
}
}
}
else {
for (j = 3; j < buff; j += 2) {
if (n[i] % j == 0) {
if (n[i] / j == j) { sum += j; break; }
else sum += n[i] / j + j;
}
buff /= j;
}
}
printf("%d\n", ++sum);
sum = 0;
}
return 0;
}
/* @END_OF_SOURCE_CODE */
しかし、それは十分に高速ではありません。助言がありますか?