【C++】CINTA学前作业一:课前准备

【BT的课堂作业~】

1、完成以下C语言代码,贴在自己的博客。

a、写一个插入排序的函数,即输入一个数组,完成排序;
b、完成一个函数,输入值为整数,输出该值的二进制。
c、完成一个判断整数是否素数的函数,即,输入一个整数,判断其是否素数。
d、编辑一个数学公式:a的立方 + b的立方 = c的立方




1.a、写一个插入排序的函数,即输入一个数组,完成排序

#include<iostream>
using namespace std;
#include<vector>

template<typename T>
vector<T>MyArraySort(vector<T>& lst, bool (*match)(const T& A,const T& B) = nullptr, bool reverse = false) {//可以放入match函数A<B返回真则获得升序。默认升序
	//二分排序
	vector<T>rst;
	vector<vector<int>>stk;//stack的意思,作为栈临时存储
	stk.push_back(vector<int>());
	for (auto i = lst.size(); i--;)//初始化stk。直接储存T的话,复制之类的操作代价有些大,所以存储索引
		stk.back().push_back(i);

	auto Match = [&match,&lst,&reverse](int a, int b)->bool{//为了方便,写一个比较函数,lst[a]小于lst[b]则返回真^reverse
		if (match == nullptr ? (lst[a] <= lst[b]) : (match(lst[a], lst[b]))) {
			if (match == nullptr ? (lst[b] <= lst[a]) : (match(lst[b], lst[a])))
				return false;
			return true ^ reverse;
		}
		return false ^ reverse;
	};

	int isMiddle = 1;//判断stk.back()装的数是不是中间数的。当这值为0时为中间数。每次将数组二分,或者成功装入中间数数组后,isMiddle会赋予1的值。在消耗长度小于2的非中间数数组时isMiddle会减1
	while (stk.empty() == false) {
		auto curr = stk.back();//获取要二分的数组
		stk.pop_back();
		if (isMiddle == 0) {
			for (auto i = curr.size(); i--;)
				rst.push_back(lst[curr[0]]);
			isMiddle = 2;//重新装填
			continue;
		}
		if (curr.size() <= 2) {//如果该数组不足3,那就单独处理
			if (curr.size() == 1) //长度1直接压入
				rst.push_back(lst[curr[0]]);
			else if(curr.size()==2){//长度2比较后压入
				if (Match(curr[0], curr[1])) {
					rst.push_back(lst[curr[0]]);
					rst.push_back(lst[curr[1]]);
				}
				else {
					rst.push_back(lst[curr[1]]);
					rst.push_back(lst[curr[0]]);
				}
			}
			--isMiddle;
		}
		else {//数组长度3以上,二分处理
			auto mid = curr[int(curr.size() / 2)];//选一个中间数
			vector<int> left;
			vector<int>middle;
			vector<int>right;
			for (auto ptr = curr.begin(); ptr != curr.end();++ptr) {
				if (Match(*ptr,mid))
					left.push_back(*ptr);
				else if (lst[mid]==lst[*ptr])
					middle.push_back(*ptr);
				else
					right.push_back(*ptr);
			}
			stk.push_back(right);
			stk.push_back(middle);
			stk.push_back(left);
			isMiddle = 1;//装填1
		}
	}
	return rst;
}

int main() {
	vector<int> lst{1,2,3,4,3,2,3,4,5,6,7,6,5,4,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1};//初始化
	auto rst = MyArraySort<int>(lst, [](const int& a,const int& b)->bool {return a >= b; },true);
	for (auto i = rst.begin(); i != rst.end(); ++i)
		cout << *i;//输出结果:11222333334444455556666777889
	return 0;
}


2.b、完成一个函数,输入值为整数,输出该值的二进制。

#include<iostream>
using namespace std;
#include<string>

string Int_BCD(unsigned num) {
	string rst;
	while (num != 0) {
		rst.push_back(num&1?'1':'0');
		num >>= 1;
	}
	return string(rst.rbegin(),rst.rend());
}

int main() {
	cout << Int_BCD(12345);//输出结果:11000000111001
	return 0;
}

c、完成一个判断整数是否素数的函数,即,输入一个整数,判断其是否素数。

#include<iostream>
using namespace std;
#include<vector>

bool IsPrime(unsigned num) {
	static vector<unsigned> Index{2};
	static unsigned Pointer = 3;

	if (num == 1)//另类首先排除掉
		return false;
	unsigned border = sqrt(num);
	for (; Pointer <= border;++Pointer) {//补充Pointer~border之间的质数
		bool flag = true;
		for (auto i = Index.begin(); i != Index.end(); ++i) {
			if (Pointer % *i == 0) {
				flag = false;
				break;
			}
		}
		if (flag) 
			Index.push_back(Pointer);
	}
	for (auto i = Index.begin(); i != Index.end(); ++i) {
		if (num == *i)
			return true;
		if (num%*i==0)
			return false;
	}
	return true;
}


int main() {
	for (int i = 0; i < 100; ++i) {
		if (IsPrime(i))
			cout << i <<' ';//输出结果:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
	}
	return 0;
}


d、编辑一个数学公式:a的立方 + b的立方 = c的立方

//题目意义不详,pass



上一篇:传统企业连接互联网的五种方式


下一篇:手机记事本软件敬业签如何添加定时提醒