Problem D: 自定义实数及其数组
来源:互联网 发布:mac 标志发亮 编辑:程序博客网 时间:2024/05/01 06:29
Problem D: 自定义实数及其数组
Description
众所周知,实数在计算机内是不能精确表示的,有些实数在存储时会产生误差。为解决这个问题,对于小数部分不包含前导和后缀0的实数(0除外),可以用两个整数分别来表示其整数部分和小数部分。如:3.14,可以分解为3和14。请基于这一思想,设计一个程序,用两个整数来表示一个实数,并利用这个新的实数类型构建一个数组,实现数组的元素插入、删除和排序。
具体而言,需要定义2个类:
1.Double类。属性为2个int类型的整数,分别为实数的整数部分和小数部分。如:原来的实数为3.14,则Double类的两个属性分别是3、14。其方法至少包括:可以接收2个整数作为参数的构造函数、缺省构造函数。
2. DoubleArray类。包括一个Double*类型的属性和一个int类型的属性,分别为数组元素和长度。该类至少包括如下方法:
(1)构造函数DoubleArray(int* a, int *b, int n):n为a、b的元素个数,相同位置的a和b的值为一个实数的整数部分和小数部分。如:若a={1,3},b={2,4},n=2,则表示有2个实数:1.2和3.4。
(2)show()方法:显示所有的元素。输出时,数组元素两两之间用1个空格隔开,且前后无多余空格,最后输出一个换行符。
(3)sortArray(bool):对数组进行排序。当参数值为true时,排序结果为递增序;否则为递减序。
(4)insertAtPos(Double, int):在第2个参数指定的位置插入第1个参数给定的对象。注意:对于长度为n的数组,合法的插入位置为[0,n]。
(5)deleteADouble(Double):删除数组中所有与给定参数相等的元素。
实际应用中,要注意:
1. 上述方法的返回值是什么?要根据main函数的调用方法来确定。
2. 仅有上述函数远远不能很好地解决这个问题,需要在Double和DoubleArray中添加其他必要的成员函数。
Input
输入有多行。第一行N>0,表示之后有N个Double类型的对象,之后的N行,每行包括2个用空格隔开的整数,分别是一个Double对象的整数部分和小数部分。
接下来的一行是一个正整数M,表示之后有M行输入,每行输入是两两之间用1个空格隔开的3个整数,前2个整数代表了要插入到当前DoubleArray对象中的一个Double对象,第3个表示插入的位置。
Output
见样例。
#include <iostream>#include <iomanip>#include <cmath>#include <algorithm>using namespace std;struct Double { int x, y; Double(int xx = 0, int yy = 0) : x(xx), y(yy) {} void show() { cout << x << "." << y; }};bool cmp1(const Double &a, const Double &b) { if (a.x != b.x) return a.x < b.x; int len1 = 1, len2 = 1; int temp1 = a.y, temp2 = b.y; while (temp1 / 10) { len1++; temp1 /= 10; } while (temp2 / 10) { len2++; temp2 /= 10; } return pow(0.1, len1) * a.y < pow(0.1, len2) * b.y;}bool cmp2(const Double &a, const Double &b) { if (a.x != b.x) return a.x > b.x; int len1 = 1, len2 = 1; int temp1 = a.y, temp2 = b.y; while (temp1 / 10) { len1++; temp1 /= 10; } while (temp2 / 10) { len2++; temp2 /= 10; } return pow(0.1, len1) * a.y > pow(0.1, len2) * b.y;}class DoubleArray {private: Double *data; int len;public: DoubleArray(int *a, int *b, int n) : len(n) { data = new Double[len + 1]; for (int i = 0; i < len; i++) { data[i].x = a[i], data[i].y = b[i]; } } void show() { if (len == 0) return; data[0].show(); for (int i = 1; i < len; i++) { cout << " "; data[i].show(); } cout << endl; } DoubleArray &sortArray(bool up) { if (up) { sort(data, data + len, cmp1); } else { sort(data, data + len, cmp2); } return *this; } void insertAtPos(Double d, int p) { if (p < 0 || p > len) return; len = len + 1; Double *temp = new Double[len + 1]; bool flag = false; for (int i = 0; i < len; i++) { if (i == p) { temp[i] = d; flag = true; } else { int j = i; if (flag) j--; temp[i] = data[j]; } } delete []data; data = temp; } DoubleArray &deleteADouble(const Double &d) { int cnt = 0; Double *temp = new Double[len + 1]; for (int i = 0; i < len; i++) { if (data[i].x != 0 || data[i].y != 0) { temp[cnt++] = data[i]; } } len = cnt; delete []data; data = temp; return *this; }};int main(){ Double one, two(10,10); int num, i, a, b, c, *iPart, *dPart; cin>>num; iPart = new int[num]; dPart = new int[num]; for (i = 0; i < num; i++) { cin>>iPart[i]>>dPart[i]; } DoubleArray test(iPart, dPart, num); test.show(); test.sortArray(true).show(); test.sortArray(false).show(); cin>>num; for (i = 0; i < num; i++) { cin>>a>>b>>c; test.insertAtPos(Double(a, b), c); } test.show(); test.deleteADouble(Double()).show(); delete[] iPart; delete[] dPart; return 0;}
- Problem D: 自定义实数及其数组
- Problem A: 自定义实数及其数组
- 自定义实数及其数组
- Problem D: 数组----逆向存储
- test 3 Problem A: [noip2016十连测第三场]平均数 (实数二分+排序+树状数组)
- 超实数及其标准部分
- CodeForces 527D Clique Problem 树状数组
- Problem D: 求数组元素的和
- Problem D: 整型数组运算符重载
- Problem D: 数组类(II)
- Problem D: 数组类(II)
- 数组可以存放实数吗?
- Problem D
- Problem D
- Problem D
- problem D
- Problem D
- Problem D
- 【mycat】mycat中配合mysql自增主键的使用
- 数据结构二叉树线索化
- springmvc的拦截器
- 手机上也能用的快手和火山视频在线解析下载工具
- Problem C: 判断两个圆之间的关系
- Problem D: 自定义实数及其数组
- ajax如何实现局部刷新
- 【Caffe的C++接口使用说明四)】Caffe中分类C++接口Demo源代码的解析
- 编程第五十七天
- 内网渗透之如何玩转Meterpreter?
- 从LINQ开始之LINQ to Objects(下)
- python的numpy学习教程
- ubuntu编译安卓4.2
- meterpreter 持久化访问的多种方式