码迷,mamicode.com
首页 > 其他好文 > 详细

OJ刷题---立方和等式

时间:2015-08-26 01:51:41      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:iostream   博客   数据   应用   计算机   

 题目要求:

技术分享


输入代码:

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



运行结果:

技术分享


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

OJ刷题---立方和等式

标签:iostream   博客   数据   应用   计算机   

原文地址:http://blog.csdn.net/linhaiyun_ytdx/article/details/47991285

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!