今年的题分两部分,时间为晚上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; }