POJ 2810完美立方
输入样例
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)
-
思路1:
直接枚举,设置4个 变量a, b, c, d,让b, c, d 从[2, a)不断取不同组合,逐一验证是否满足公式 -
优化思路1:
1)由b <= c <= d
可以设置b的循环范围为[2, c),c为[b, d),d为[c, a) --> 循环变量由外到内依次为:a, b, c, d(使)a成为b,c,d,b成为c…的约束条件
2)立方计算会有大量重复,预先开一个数组存好从2到N的立方数
3)细节:a可以从6开始 -
code1:
#include <cstdio>
int CubeNum[200];
int main(){
int n;
scanf("%d", &n);
for(int i = 2; i <= n; ++i){
CubeNum[i] = i * i * i;
}
int c = 2, d = 2;
for(int a = 6; a <= n; ++a){
for(int b = 2; b <= c; ++b){
for(c = b; c <= d; ++c){
for(d = c; d <= a; ++d){
if(CubeNum[a] == CubeNum[b] + CubeNum[c] +CubeNum[d])
printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d);
}
}
}
}
return 0;
}
- WA1:计算立方数组的for_loop里,i 没有取到 n, a 一直循环到 n,所以需要
CubeNum[n]
即n^3