#include<stdio.h> #include<math.h> #define MAX_N 100 int prime[MAX_N + 5]; int sum[MAX_N + 5] = {1, 1}; void init() { for (int i = 2; i <= MAX_N; i++) { if (!prime[i]) { prime[++prime[0]] = i; sum[i] += (i + 1); } for (int j = 1; j <= prime[0]; j++) { if (i * prime[j] > MAX_N) break; prime[i * prime[j]] = 1; if (i % prime[j] == 0) { int cnt = 1, tmp = i, ans = 1;; while (tmp % prime[j] == 0) { cnt++; tmp /= prime[j]; } while (cnt) ans += pow(prime[j], cnt--); // printf("cnt[%d prime = %d] = %d\n, ans = %d\n", i * prime[j], prime[j], cnt, ans); sum[i * prime[j]] = ans * (sum[tmp]); break; }else { sum[i * prime[j]] = sum[i] * sum[prime[j]] ; } } } } int main() { init(); for (int i = 1; i <= MAX_N; i++) { printf("%d\n", sum[i]); } return 0; } 代码优化
时间: 2024-04-09 10:27:53 浏览: 106
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
对于给定的范围内的每个数,计算其因子和的代码可以进行一些优化。以下是经过优化的代码:
```c
#include <stdio.h>
#include <math.h>
#define MAX_N 100
int sum[MAX_N + 5] = {1, 1};
void init() {
for (int i = 2; i <= MAX_N; i++) {
int sqrt_i = sqrt(i);
int factor_sum = 1;
for (int j = 2; j <= sqrt_i; j++) {
if (i % j == 0) {
factor_sum += j;
if (i / j != j) {
factor_sum += (i / j);
}
}
}
sum[i] = factor_sum;
}
}
int main() {
init();
for (int i = 1; i <= MAX_N; i++) {
printf("%d\n", sum[i]);
}
return 0;
}
```
在优化后的代码中,我们使用了一个循环来计算每个数的因子和。对于每个数`i`,我们只需要遍历从2到`sqrt(i)`范围内的数,找到能整除`i`的因子,并将其加到因子和`factor_sum`中。同时,我们还需要将`i`除以因子`j`得到的另一个因子也加到因子和中,但需要注意避免重复计算平方数的情况。最后,将计算得到的因子和赋值给`sum[i]`。
这种优化方法可以减少不必要的循环次数,提高代码执行效率。
阅读全文