被数组越界坑了一把。
codeblocks不提示数组越界,这是不是让人很无奈。。。。。
先找出所有的充足数。然后任意两个充足数相加的数标记为1;
所有没标记的数记为不充足数。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 58124
int add[maxn];
int vis[maxn];
int have[maxn];
int tops;
void dos()
{
int i,j;
for(i=1;i<maxn;i++)
{
for(j=2;j*i<maxn;j++)
{
add[j*i]+=i;
}
}
tops=0;
for(i=1;i<maxn;i++)
{
if(add[i]>i)
{
have[tops++]=i;
}
}
cout<<have[0]<<endl;
cout<<tops<<endl;
for(i=0;i<tops;i++)
{
for(j=0;have[j]+have[i]<maxn;j++)
{
int t=have[i]+have[j];
vis[t]=1;
}
}
}
int main()
{
// freopen("out.txt.","w",stdout);
int sum,i;
memset(vis,0,sizeof(vis));
memset(have,0,sizeof(have));
memset(add,0,sizeof(add));
dos();
sum=0;
for(i=0;i<maxn;i++)
{
if(vis[i]==0)
{
sum+=i;
}
}
cout<<sum<<endl;
return 0;
}