肇砖oj题,仅供参考,不怕被钟sir封号三周你就抄
Description
请实现一个模版类 Array ,实现可以直接访问的线性群体,包括:
私有数据成员:
T* list; /// 用于存放动态分配的数组内存首地址
int siz; /// 数组大小。为了避免与 size 同名而高亮显示,特意减少一个字符
成员函数:
-
构造函数 : Array( int sz = 10 )
-
拷贝构造函数 : Array( const Array<T> &a )
-
析构函数 : ~Array()
-
重载赋值运算符 operator = : operator = ( const Array<T> &rhs )
-
重载 下标运算符[] ,用于 左值: operator [] ( int i )
-
载 下标运算符[] 常函数,用于 右值 : operator [] ( int i ) const
-
重载到 T* 类型的转换 :operator T * ()
-
取数组的大小 : getSize()
-
修改数组的大小 : resize( int sz )
程序框架:
#include <iostream> #include <cassert> #include <iomanip> using namespace std; 你的 Array 模版类代码放在这里 /// read() 用于验证 重载的指针转换运算符 void read( double *p, int n ) { for ( int i = 0; i < n; i++ ) cin >> p[i]; } int main() { int n; cin >> n; Array<double> da(n); /// 创建一个 double类型元素 的 对象da read( da, n ); /// 输出 Array类的 对象da 全部元素 for ( int i = 0; i < da.getSize(); i++ ) cout << da[i] << ' '; cout << endl; Array<int> prime(5); /// 创建一个 int类型元素 的 对象prime /// 求 [2, n] 的全部素数,存放到 prime 中 int cnt = 0; /// 统计当前找到的素数的个数 cin >> n; /// 读入范围 for ( int i = 2; i <= n; i ++ ) { /// 检查 i 是否能被比它小的素数整除 bool isPrime = true; for ( int j = 0; j < cnt; j ++ ) /// 若 i 被 prime[j] 整除,说明 i 不是质数 if ( i % prime[j] == 0 ) { isPrime = false; break; } if ( isPrime ) { if ( cnt == prime.getSize() ) /// 当装满了 prime.resize( cnt * 2 ); /// 空间扩大一倍 prime[ cnt ++ ] = i; } } for ( int i = 0; i < cnt; i ++ ) cout << setw(8) << prime[i]; cout << endl; return 0; }
Input
第一行是一个整数 k ( k > 0 )
第二行是 k 个浮点数,表示要存入 Array对象 da
第三行是一个整数 n ( n > 2 ),表示要找出 [ 2, n ] 中的素数,存入 Array对象 prime 中
Output
第一行输出 n 个读入的浮点数
第二行从小到大输出 [ 2, n ] 中的素数
Sample Input
5
1.23 2.34 3.1415 4.56 10.00001
10
Sample Output
1.23 2.34 3.1415 4.56 10.00001
2 3 5 7
#include <iostream>
#include <cassert>
#include <iomanip>
using namespace std;
template <class T>
class Array{
private:
T *list;
int size;
public:
Array(int sz){
size = sz;
list = new T [size];
}
int getSize(){
return size;
}
T &operator [](int n){
return list[n];
}
const T &operator [](int n) const{
return list[n];
}
void resize(int sz){
if(size==sz) return;
T *newlist = new T [sz];
int n = (sz<size)?sz:size;
for(int i=0;i<n;i++)
newlist[i]=list[i];
delete[]list;
list=newlist;
size=sz;
}
operator T *(){
return list;
}
operator const T * () const{
return list;
}
};
/// read() 用于验证 重载的指针转换运算符
void read( double *p, int n ) {
for ( int i = 0; i < n; i++ )
cin >> p[i];
}
int main() {
int n;
cin >> n;
Array<double> da(n); /// 创建一个 double类型元素 的 对象da
read( da, n );
/// 输出 Array类的 对象da 全部元素
for ( int i = 0; i < da.getSize(); i++ )
cout << da[i] << ' ';
cout << endl;
Array<int> prime(5); /// 创建一个 int类型元素 的 对象prime
/// 求 [2, n] 的全部素数,存放到 prime 中
int cnt = 0; /// 统计当前找到的素数的个数
cin >> n; /// 读入范围
for ( int i = 2; i <= n; i ++ ) { /// 检查 i 是否能被比它小的素数整除
bool isPrime = true;
for ( int j = 0; j < cnt; j ++ )
/// 若 i 被 prime[j] 整除,说明 i 不是质数
if ( i % prime[j] == 0 ) {
isPrime = false;
break;
}
if ( isPrime ) {
if ( cnt == prime.getSize() ) /// 当装满了
prime.resize( cnt * 2 ); /// 空间扩大一倍
prime[ cnt ++ ] = i;
}
}
for ( int i = 0; i < cnt; i ++ )
cout << setw(8) << prime[i];
cout << endl;
return 0;
}