OJ刷题---立方和等式

题目要求:

输入代码:

#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

OJ刷题---立方和等式的相关文章

OJ刷题常用的4中基本输入形式

初到OJ网站上刷题,输入形式就是我们要考虑的问题.通过自己的一些摸索,OJ题目的输入形式大体上无外乎4种.下面就详细介绍: 1 输入数据文件中,第一行数据标明了测试数据的数目: 2 输入数据文件中,有标明输入结束的数据 3 输入数据文件中,测试数据一直到文件尾 4 没有输入数据 第1中情形的处理方法: //int i,kase scanf("%d",&kase); for(i=1;i<=kase;i++) { //处理第i中情况 } ...................

基于C#解决OJ刷题之输入输出问题的总结(AKOJ1064-1071A+B问题汇总)

声明:题目部分为akoj题目,代码为本人AC代码. 因为本人学校的oj支持各种环境,非常正常的当中就包括了C#.然暑假在家较为空暇,本着学习C#和复习算法的态度和目的,就又開始折腾起oj了. 题目部分是最基础的A+B系列,来看看C#的输入输出是怎么一回事吧 题目地址:http://183.167.205.82:8081/JudgeOnline/problemlist?volume=1 本文由csdn-jtahstu原创.转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:137375842

第十六周oj刷题——Problem C: B 求类中数据成员的最大值-类模板

Description 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. Input 分别输入3个整数,3个浮点数,3个字符 Output 3个整数的最大值 3个浮点数中的最大值 3个字符中的最大值 Sample Input 9 5 6 1.1 3.4 0.9 a b c Sample Output 9 3.40 c /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 6 月 25 日

第十六周oj刷题——Problem D: B 友元类-计算两点间距离

Description 类Distance定义为类Point的友元类来实现计算两点之间距离的功能. Point类中有两个私有数据成员X和Y来表示点的两个坐标(横坐标和纵坐标), 成员函数需要自己定义. 主程序输入两个Point点的坐标,计算两个点之间的距离. Input 两个点的坐标(横坐标和纵坐标) Output 两个点的距离(保留了两位小数) Sample Input 1.0 1.0 2.0 2.0 Sample Output 1.41 /* All rights reserved. * 文

第十五周oj刷题——Problem I: C++ 习题 比较大小-类模板

Description 声明一个类模板,利用它分别实现两个整数.浮点数和字符的比较,求出大数和小数.说明:在类模板外定义各成员函数. Input 输入两个整数.两个浮点数和两个字符 Output 从大到小输出两个整数.两个浮点数和两个字符 Sample Input 3 7 45.78 93.6 a A Sample Output 7 3 93.60 45.78 a A   /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年

oj刷题——第十五周C++习题 对象转换

Description 定义一个Teacher(教师)类(教师号,姓名,性别,薪金)和一个Student(学生)类(学号,姓名,性别,成绩),二者有一部分数据成员是相同的,num(号码),name(姓名),sex(性别).编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去.可以设想为: 一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为其教师数据的一部分. Input 一个教师的信息和一个学

第十五周oj刷题——Problem E: C++习题 对象数组求最大值

Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. Input n和n个学生的学号.成绩 Output 成绩最高者的学号和成绩 Sample Input 5 101 78.5 102 85.5 103 98.5 104 100.0 105 95.5 Sample Output 104 100.00 /* All rights reserved. * 文件名称:

第十五周oj刷题—— Problem C: 矩形类中运算符重载【C++】

Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩形相加的规则是:决定矩形的对应坐标分别相加,如 左下角(1,2),右上角(3,4)的矩形,与 左下角(2,3),右上角(4,5)的矩形相加,得到的矩形是 左下角(3,5),右上角(7,9)的矩形. 这个规则没有几何意义,就这么定义好了. 输出面积的功能通过重载"<<&quo

第十五周oj刷题——Problem B: 矩形类定义【C++】

Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. Input 四个数,分别表示矩形左下角和右上角顶点的坐标,如输入3.7 0.4 6.5 4.9,代表左下角坐标为(3.7, 0.4),右上角坐标为(6.5, 4.9). Output 输出一共有3行(请参考提示(hint)中的main函数): 第一行:由输入的坐标确定的矩形对象p1的面积 第二行:由对象复