思路一、排序 暴力
//a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0
//拆成a3x33+ a4x43+ a5x53 = -(a1x1 3+ a2x2 3)
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int num[6], cube[101], sum1[10001], sum2[1000001];
int main()
{
int i, j, k;
int a, b;
int count;
for(i=0; i<5; i++)
scanf("%d", &num[i]);
k=0;
for(i=-50; i<=50; i++)
{
if(i!=0)
cube[k ++]=i*i*i;
}
a=0; b=0;
for(i=0; i<100; i++)
for(j=0; j<100; j++)
sum1[a++]= -(cube[i]*num[0]+cube[j]*num[1]);
for(i=0; i<100; i++)
for(j=0; j<100; j++)
for(k=0; k<100; k++)
sum2[b++]= cube[i]*num[2]+cube[j]*num[3]+cube[k]*num[4];
qsort(sum1, a, sizeof(sum1[0]), cmp);
qsort(sum2, b, sizeof(sum2[0]), cmp);
i=0; j=0; count=0;
while(i<a && j<b)
{
if(sum1[i]<sum2[j])
i ++;
else if(sum1[i]>sum2[j])
j ++;
else //有可能有相同的值,要注意!
{
k=i;
while(sum1[k]==sum2[j])
{
count ++;
k ++;
}
j ++;
}
}
printf("%d/n", count);
return 0;
}
思路二、哈希查找 尚待深入研究
#include <stdio.h>
#define n 12500000
/*必须用char型!,否则会mle,因为char以一个字节存放一个字符,
存放的是该字符相应的ASCII码. int VC++ 4个字节, Turbo C 2.0和
TURBO c++ 3.0 2个字节 范围0-255
*/
char hash[n*2];
int main()
{
int i, j, k;
int count, temp;
int num[6], cube[101];
k=0;
for(i=-50; i<=50; i++)
{
if(i!=0)
cube[k ++]=i*i*i;
}
for(i=0; i<5; i++)
scanf("%d", &num[i]);
for(i=0; i<100; i++)
for(j=0; j<100; j++)
{
temp= -(cube[i]*num[0]+cube[j]*num[1]);
hash[temp+n] ++;
}
count=0;
for(i=0; i<100; i++)
for(j=0; j<100; j++)
for(k=0; k<100; k++)
{
temp = cube[i]*num[2]+cube[j]*num[3]+cube[k]*num[4];
if(temp>=-n && temp<=n)
count += hash[temp+n]; //为什么能这样加?
}
printf("%d/n", count);
return 0;
}