刷题第一天:南邮NOJ完美立方

完美立方

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 5496            测试通过 : 1443 

比赛描述

a3 = b3 + c3 + d3为完美立方等式。例如123 = 63 + 83 + 103 。编写一个程序,对任给的正整数N (N100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中1N



输入

正整数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
#include
void Cube(int n);
int main()
{
    int N,m;
    scanf("%d",&N);//读入数据范围
    for(m=1;m<=N;m++)
    {
        Cube(m);
    }
    return 0;
}
void Cube(int n)//申明Cube函数
{
    int i,j,k;
    double a,a1,b,c;
    a=pow(n,3);//储存n^3的数值
    for(i=2;i     {
b=pow(i,3);//在此处计算i^3的值可使下面的循环减少n^2个计算该项的次数,大量节省时间
        for(j=i;j         {
c=pow(j,3);//同理此处可节省n次计算j^3的次数
            for(k=j;k             {
                a1=b+c+pow(k,3);
                if(a1==a)
                    printf("Cube = %d, Triple = (%d,%d,%d)\n",n,i,j,k);//若判断相同则输出
            }
        }
    }
}

程序完善过程中使用了二叉树的结构思想,在计算过程中有三个计算循环,首先假设计算6以内的循环次数,那么就需要计算2,3,4,5,6五组对应数据,例如当n=6时,i的取值可以从2~5,j,k,同理,那么就有数据重复,例如(3,4,5)(4,3,5)等,实际为同一组数据,要使输出的数据仅为从小到大排列的那组,那么通过二叉树结构的分析可以知道,当j从i起始,k从j起始时,数据可以按要求输出。

你可能感兴趣的:(南邮NOJ刷题记录)