完美立方

/*a3 = b3 + c3 + d3为完美立方等式。例如123 = 63 + 83 + 103 。
编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),
使得a3 = b3 + c3 + d3,其中1<a, b, c, d ≤N。
输入
正整数N (N≤100)
输出
每行输出一个完美立方,按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同
,则依次按照b、c、d进行非降升序排列输出,即b值小的先输出、然后c值小的先输出、然后d值小的先输出。
样例输入
24
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
*/
/*
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,x,y,z;
do
{
scanf("%d",&n);
}while(n<0||n>100);
for(i=2;i<=n;i++)
{
for(x=1;x<=n;x++)
for(y=x+1;y<=n;y++)
for(z=y+1;z<=n;z++)
if(pow(i,3)==pow(x,3)+pow(y,3)+pow(z,3))
{
printf("Cube = %d, Triple = (%d,%d,%d)",i,x,y,z);
printf("\n");
}
}

return 0;
}
*/

优化后的代码
#include<stdio.h>
#include<math.h>
int main()
{
int cube[101];
int n,i,a,b,c,d;
scanf("%d",&n);
for(i=1;i<=n;i++)
cube[i]=pow(i,3);
for(a=6;a<=n;a++)
for(b=2;b<=a-2;b++)//当b=1时无法找到满足的其他值,可先取连续的 b,c,d,
//即c取b+1,d取b+2,则b+2<a,才有可能取到满足的值
{
if(cube[a]<cube[b]+cube[b+1]+cube[b+2])
break;//若cube[a]小于连续的b,c,d所对应的cube值,即更不可能满足
//非连续的b,c,d所对的cube值则退出循环
for(c=b+1;c<a-1;c++)
{
if(cube[a]<cube[b]+cube[c]+cube[c+1])
break;//当b相对固定时,cube[a]的值小于连续的c.d所对应的cube值时
//即无法满足非连续的c,d所对应的 cube值则退出循环
for(d=c+1;d<n;d++)
if(cube[a]==cube[b]+cube[c]+cube[d]) //当cube[a]大于连续的b,c,d所对应的cube值时,
// c相对固定,逐个寻找相应的d
printf("Cube=%d,Triple=(%d,%d,%d)\n",a,b,c,d);
}
}

return 0;
}

你可能感兴趣的:(完美立方)