题目:
解法一:
对于情况(1),因子为1和本身以及p,q;它的因子和为1+p+q+pq=(p+1)*(q+1)
对于情况2,因子为p,p的平方和1和本身。它的因子和为1+p^3+p^2+p=(p^4-1)/(p-1)
bool f[100001];
int primes[10001];
void ethPrime()
{
int i;
long long j;
f[0] = f[1] = 1;
primes[0] = 0;
for(i = 2; i < 100001; ++i)
{
if(!f[i])
{
primes[++primes[0]] = i;
for(j = (long long)i * i; j < 100001; j += i)
{
f[j] = 1;
}
}
}
}
bool isPrime(int x)
{
return !f[x];
}
int sumFourDivisors(int* nums, int numsSize)
{
int i, j, p, q;
int ret = 0;
ethPrime();
for(i = 0; i < numsSize; ++i)
{
for(j = 1; j <= primes[0]; ++j)
{
p = primes[j];
if(nums[i] % p == 0)
{
q = nums[i] / p;
if( isPrime(q) && p != q)
{
ret += (p+1)*(q+1);
}
if( q == (long long)p * p )
{
ret += p*p*p + p*p + p + 1;
}
break;
}
}
}
return ret;
}
方法二:
简单粗暴,求出数组中每一个元素的因子数,然后判断因子的个数是否为4。
int sumFourDivisors(int* nums, int numsSize)
{
int ret=0;
int sumcnt=0;
for(int i=0;i<numsSize;i++)
{
int cnt=0;
int sum=0;
for(int j=1;j<=sqrt(nums[i]);j++)
{
if(nums[i]%j==0)
{
if(j*j!=nums[i])
{
cnt+=2;
sum=j+nums[i]/j+sum;
}
else
{
cnt+=1;
sum=sum+j;
}
}
}
if(cnt==4)
{
ret+=sum;
sumcnt++;
}
}
if(sumcnt>0)
return ret;
return 0;
}