看到题目,首先是求三角形数,无脑累加枚举出来就行了
枚举之后运用因数定理去判断该三角形数的因数个数是否满足要求就行了
下面是我的第一遍错误代码
对应质因数的次数我尝试用一个数列去保存,但是这是不明智的选择
#include <iostream>
int main() {
long sum=0;
int a[40]={0};
int num=1;
for(int i=1;i>0;i++)//外层循环先找三角形数
{
sum+=i;
//尝试分解质因数利用约数定理判断因数个数
int flag2=2;
int flag1=0;
long nsum=sum;
for(int j=0;j<40;j++){
a[j]=0;
}
for(int j=2;j<=nsum;j++)
{
while(nsum%j==0)
{
nsum/=j;
if(flag2!=j){
flag1++;
}
a[flag1]++;
}
flag2=j;
}
for(int j=0;j<=flag1;j++){
num*=(a[j]+1);
}
if(num<500)
num=1;
else
break;
}
std::cout<< sum<< std::endl;
std::cout << "Hello, World!" << std::endl;
return 0;
}
下面看正确代码:
#include <iostream>
int main(){
long sum=0;
int i=0;
//先累加出这个三角形数
while(1)
{
i++;
sum+=i;
//尝试分析这个三角形数的所有因数个数
//判断因数个数将使用分解质因数求解因数个数
//分解质因数,从最大的质因数开始递归分解
long flag=sum;
int s=1,c=0;
for(int j=2;flag!=1;j++)
{
while(flag%j==0) { //非常巧妙的选择用while将一个质因数彻底的从sum中剥离出来,并且可以方便计算其次数,计算质因数的次数是本题难点
flag /= j;
c=c+1;
}
s*=(c+1);
c=0;
}
if(s>=500){
printf("%ld",sum);
return 0;
}
}
}