POJ 1543Perfect Cubes - 完美立方 - 详解

题目大意:形如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;
} 

有什么不懂可以在评论区问我,我会及时回答的,感谢阅读,希望能帮到您!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值