Answer: | 76576500 |
#include<iostream>
#include<math.h>
using namespace std;
int value(int temp){
int num = 0;
for(int i=1;i<=sqrt(temp);i++){
if(temp%i==0){
if(i==sqrt(temp)){
num++;
}else{
num+=2;
}
}
}
return num;
}
int main()
{
int temp=0;
for(int i=1;;i++){
temp += i;
if(value(temp)>500){
cout<<temp<<endl;
break;
}
}
return 0;
}
约数是前后对应相乘的,开方减少运算量,对奇数的结果注意sqrt(temp)只有一个即可
更新一下做法,利用线性筛求因子数:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX_N 1000000
int prime[MAX_N+5];
int f[MAX_N+5];
int cnt[MAX_N+5];
int main() {
f[1] = 1;
/*利用线性筛求素因子数量*/
for (int i = 2; 2 * i <= MAX_N; i++) {
if (!prime[i]) {
prime[++prime[0]] = i;
f[i] = 2; //素数算一下因子数量
cnt[i] = 1;
}
for (int j = 1; prime[j] * i <= MAX_N; j++) {
prime[prime[j] * i] = 1; //合数处算一下因子数量
if (i % prime[j] == 0) {
f[prime[j]*i] = f[i] / (cnt[i] + 1)*(cnt[i] + 2);
cnt[prime[j]*i] = cnt[i] + 1;
break;
} else {
f[prime[j]*i] = f[prime[j]] * f[i];
cnt[prime[j] * i] = 1;
}
}
}
long long n = 1;
while (true) {
int f_nums ;
if (n%2) {
f_nums = f[n] * f[(n+1)/2];
} else {
f_nums = f[n/2] * f[n+1];
}
if(f_nums >= 500) break;
n++;
}
cout << n * (n+1) / 2 << endl;
return 0;
}