今年的题分两部分,时间为晚上7:00-9:30,题目分不定项选择与两道编程题。
下面是我自己抄下来的一部分题,尽飨读者。
1.堆排序属于下面哪种排序方法?
A、选择排序 B、插入排序、C、交换排序 D、归并排序
答案: A
2. 用RSA算法加密时,已知公匙是(e=7,n=20),私匙是(d=3,n=20),用公匙对消息M=3加密,得到的密文是?
A . 13 B.12 C.19 D.7
答案:D
解析:
n=20
e=7 公钥
d=3 私钥
对M=3 进行加密
M'=M^e%n (M的e次方,然后除以n取余数)
M'=3^7%20=2187%20=7 加密后等于7
对M'=7进行解密
M=M'^d%n=7^3%20=343%20=3 解密后又变成3了
因此答案是D
3.编程题:
已知一个二维数组n*n,我们希望二维数组的每一位均>=右边的数,同时也>=下面的数,请编写函数调整数组,使之满足要求(边界除外)。
如: A=
10 5 0
4 6 1
2 3 7
调整后:
10 6 5
7 4 3
2 1 0
解析:
我用了两种办法,一种不动脑筋的,直接将上面从大到小按照从左往右,从上往下的顺序填写即可。排序时间复杂度为O(n^2log(n^2))
第二种办法:对每一行从大到小排序,然后每一列从大到小排序,即可。时间复杂度为O(n^2logn),稍好一些,应该还有其它的方法。这个问题的答案不唯一啊。
方法一、
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void RecombineArray(int* a, int n)
{sort(a,a+n*n,std::greater<int>());}
int main()
{int a[3][3] = { { 10, 5, 0 }, { 4, 6, 1 }, { 2, 3, 7 } };RecombineArray2((int*)a,3);for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}
注:由于二维数组存储正好是按照从上往下,从左往右的顺序存储,所以二维数组很容易拉成一维数组,然后按照一维数组的方式对其正常排序即可
方法二、
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;void RecombineArray(int* a, int n)
{for (int i = 0; i < n;i++)//对行从大到小排序{sort(a+n*i,a+n*i+n, std::greater<int>());}for (int j = 0; j < n;j++)//对列从大到小排序{vector<int> temp;temp.reserve(n*n);for (int i = 0; i < n;i++){temp.push_back(*(a + n*i + j));}sort(temp.begin(),temp.end(), greater<int>());for (int i = 0; i < n; i++){*(a + n*i + j) = temp[i];}}}int main()
{int a[3][3] = { { 10, 5, 0 }, { 4, 6, 1 }, { 2, 3, 7 } };RecombineArray((int*)a,3);for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}