/*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;
}