题目要求:
输入代码:
#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; }
运行结果:
总结:一开始打算只用穷举法,看能否列出所有情况,但后来发现那根本解决不了问题。因为不仅需要立方相等,还需要从小到大列出方根的情况,而且不能重复,于是思考了半天,还是解决不了,最终选择了参考别人的解答,用到了链表,这个自己最薄弱的知识点。用链表读取数据,而后指向数组的地址排序方根,果然方便多了,而且没有重复,自己在用穷举出现的列举重复问题,链表得以解决了。虽然解不出,但收获还是蛮大的。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-21 07:17:20