题目大意:形如a3= b3 + c3 + d3的等式被称为完美立方等式。例如123= 63 + 83 + 103。编写一个程序,对任给的正整数N(NS100),寻找所有的四元组(a, b, c, d),使得a3 = b3 +c3 + d3,其中a,b,c,d大于1,小于等于N,且b<=c<=d。
•输入
一个正整数N (N<100)。
*输出
每行输出一个完美立方。输出格式为:
Cube = a, Triple = (b,c,d)
其中a,b,c,d所在位置分别用实际求出四元组值代入
请按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同,则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)
解题思路:此题可以采用枚举方式,对 a、b、c、d的值按照一定的顺序进行枚举,在满足 a^3 = b^3 + c^3+d^3时按照要求输出。题目要求按照 a的值从小到大输出,并且 b,c,d按照非降序排列,所以枚举的关键在于一下两点。
(1)确定 a,b,c,d的取值范围和枚举顺序。①考虑到 ( b , c , d)去(2,2,2),(2,2,3),(2,3,3),(2,2,4)及(2,3,4)时都没有满足条件的 a,所以 a>=6(2*3+3^3+4^3+5^3),并且 a应该在循环的最外层,由小到大的枚举;②由题意可知 2<=b<=c<=d<=a,所以循环由外至内为 b,c,d,它们的取值上限都是 a-1,下限分别是2,b,c。
(2)避免重复计算。在循环的最内层,需要在判断是否满足 a^3=b^3+c^3+d^3时计算 4次立方值,而 a,b,c,d在循环中经常取之前去过的值,因此会产生很多次重复计算,这里 1 < a,b,c,d<=N,因此实际上最多只需要计算 2~N的立方。可以考虑用一个数组存储事先计算好的立方值,使用时直接访问即可。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int N,a,b,c,d;
int cube[101];
scanf("%d",&N);
for(int i=2;i<=N;i++){//预处理 2 ~ N的立方
cube[i] = i*i*i;
}
for(a=6;a<=N;a++){
for(b=2;b<a;b++){
for(c=b;c<a;c++){
for(d=c;d<a;d++){
if(cube[a] == cube[b] + cube[c] + cube[d]){
//判断条件是否成立
printf("Cube= %d, Triple = (%d,%d,%d)",a,b,c,d);
//Cube = 20, Triple = (7,14,17)
}
}
}
}
}
return 0;
}
有什么不懂可以在评论区问我,我会及时回答的,感谢阅读,希望能帮到您!