OJ刷题---立方和等式

来源:互联网 发布:淘宝助理5.6.9 编辑:程序博客网 时间:2024/05/02 04:27

 题目要求:



输入代码:

#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;}



运行结果:



总结:一开始打算只用穷举法,看能否列出所有情况,但后来发现那根本解决不了问题。因为不仅需要立方相等,还需要从小到大列出方根的情况,而且不能重复,于是思考了半天,还是解决不了,最终选择了参考别人的解答,用到了链表,这个自己最薄弱的知识点。用链表读取数据,而后指向数组的地址排序方根,果然方便多了,而且没有重复,自己在用穷举出现的列举重复问题,链表得以解决了。虽然解不出,但收获还是蛮大的。。。

0 0