我已经解决了一个问题:
给定一个自然数 n (1 <= n <= 500000),请输出其所有适当除数的总和。
定义:自然数的适当除数是严格小于该数的除数。
例如,数字 20 有 5 个真除数:1、2、4、5、10,除数之和为:1 + 2 + 4 + 5 + 10 = 22。
输入
一个整数,表示测试用例的数量(大约等于 200000),后面有许多行,每行包含一个介于 1 和 500000 之间的整数(包括 1 到 500000)。
输出
每行一个整数:分别给定的整数的除数和。
例子
样本输入:
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 */
但这还不够快。有什么建议么?