题目要求:
输入代码:
#include<iostream>
#include<cmath>
using namespace std;
typedef struct node
{
int data[4];
struct node *next;
} node,*nodep;
int arr[30];
void Power()
{
arr[0]=0;
for(int i=0; i<30; i++)
{
arr[i]=i*i*i;
}
}
void sort(int arr[],int n)//冒泡法将数组array中的元素按从小到大的顺序排序
{
int i,j,temp;
for(j=0; j<n-1; j++)
for(i=0; i<n-1-j; i++)
if(arr[i]>arr[i+1])
{
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
int main()
{
Power();
nodep head,p,q;
head=new(node);//用于存放数据的链表头结点
head->next=NULL;
q=head;
int i,j,k,t;
for(i=1; i<=29; i++)
{
for(j=1; j<=29; j++)
{
if(i==j)
{
continue ;
}
for(k=1; k<=29; k++)
{
if(i == k || j == k)
continue;
for(t=1; t<=29; t++)
{
if(i == t || j == t || k == t)//避免出现重复数据
continue;
if((arr[i] + arr[j]) == (arr[k] +arr[t]))
{
int flag=0;
p=new(node);
p->data[0]=i;
p->data[1]=j;
p->data[2]=k;
p->data[3]=t;
sort(p->data,4);//排序方根数
nodep px=head;
while(px)
{
int m;
for(m=0; m<4; m++)
{
if(px->data[m]!=p->data[m])//判断新结点中的数据是否与已存在的数据重复
break;
}
if(m==4)//当新结点中的数据与已存在的数据重复时将结束标志置为1,并结束while循环
{
flag=1;
break;
}
else
px=px->next;//否则指针后移
}
if(flag)//结束标志为1时,即新结点中的数据与已存在的数据重复时,释放新结点,并结束本次循环
{
delete(p);
continue;
}
//将新结点连接到链表中
p->next=NULL;
q->next=p;
q=p;
//输出找到的组合
for(int a=0; a<3; a++)
{
cout<<p->data[a]<<",";
}
cout<<p->data[3]<<endl;
}
}
}
}
}
return 0;
}
总结:一开始打算只用穷举法,看能否列出所有情况,但后来发现那根本解决不了问题。因为不仅需要立方相等,还需要从小到大列出方根的情况,而且不能重复,于是思考了半天,还是解决不了,最终选择了参考别人的解答,用到了链表,这个自己最薄弱的知识点。用链表读取数据,而后指向数组的地址排序方根,果然方便多了,而且没有重复,自己在用穷举出现的列举重复问题,链表得以解决了。虽然解不出,但收获还是蛮大的。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/linhaiyun_ytdx/article/details/47991285