您的位置:首页 > 其它

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

2016-03-26 16:54 183 查看

完美立方

时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte

总提交 : 5496 测试通过 : 1443

比赛描述

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>

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<n;i++)

{

b=pow(i,3);//在此处计算i^3的值可使下面的循环减少n^2个计算该项的次数,大量节省时间

for(j=i;j<n;j++)

{

c=pow(j,3);//同理此处可节省n次计算j^3的次数

for(k=j;k<n;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起始时,数据可以按要求输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: