怎么国内做project euler的人是不是很少……
都木有人来看我写的……
哎~
无所谓~反正我这水品~闲的时候自娱自乐就好~
这题提到了3种数:
perfect number
deficient number
abundant number
应该不难看懂,然后捏,就是暴力了……
因为我之前算错了一个地方……
于是换用另外一个方法做……总共两种……
但是错误竟然出在一块了……
题目中说的
24 是最小的 isSumOf2Abu
12 是最小的 isAbu
而我之前却把24当做了min_n,这不科学……
#include <stdio.h>
int
main()
{
int max_n = 28123, min_n = 12;
int i, j, now;
int *p, a[28123], f[28300];
p = a;
for (i=0; i<28300; i++)
f[i] = 0;
for (i = min_n; i<=max_n; i++)
{
now = 1;
for (j = i/2; j>1; j--)
if (i%j == 0)
{
now += j;
}
if (now > i)
{
*p = i;
p += 1;
}
}
int sum = 0;
int len = p - a;
for (i=0; i<len; i++)
for (j=i; j<len; j++)
{
now = a[i]+a[j];
if (now < max_n && !f[now])
{
f[now] = 1;
sum += now;
}
}
sum = max_n*(max_n-1)/2 - sum;
printf("%d", sum);
}
这里还有一个问题,那就是关于p这个指针的,因为
if (now > i)
{
*p = i;
p += 1;
}
所以指针一直指向的是一个空的位置,存的东西是个rubbish……
所以……下面这句就不能写成 p-a+1...
int len = p - a;
最初我犯了这个错误……细节啊……然后答案就差了微小的一点~嗯……
幸好我printf了看了一下……(我也是这么教女神的~^_^)
下面这个是另外一种方法,两种方法速度差不多~第二种稍微快点。因为check的过程要简略很多~毕竟isSumOfAbu的数太多……
#include <stdio.h>
int f[28300];
int
isSumOf2Abu(int n)
{
int i;
for (i=0; i<=n; i++)
if (f[i] && f[n-i])
return 1;
return 0;
}
int
main()
{
int max_n = 28123, min_n = 12;
int i, j, now;
for (i=0; i<28300; i++)
f[i] = 0;
for (i = min_n; i<max_n; i++)
{
now = 1;
for (j = i/2; j>1; j--)
if (i%j == 0)
{
now += j;
}
if (now > i)
f[i] = 1;
}
int sum = 0;
for (i=0; i<max_n; i++)
if (!isSumOf2Abu(i))
sum +=i;
//sum = max_n*(max_n-1)/2 - sum;
printf("%d", sum);
}