考试时间 2 hours
一、15 分
斐波那契数列为:1,1,2,3,5…
请输入一个 n,要求输出斐波那契数列的第 n 项(要求用递归)
二、25 分
蛇形矩阵,是由 1 开始的自然数一次排列成的 N*N 的正方形矩阵,请输入一个 n,要求输
出宽度为 n 的蛇形矩阵 ,例如:
【输入】
3
【输出】
1 2 3
6 5 4
7 8 9
【输入】
6
【输出】
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 16 17 18
24 23 22 21 20 19
25 26 27 28 29 30
36 35 34 33 32 31
三、30 分
任意一个偶数都可以拆分为两个素数之和,请输入一个偶数,然后将其写成两个素数之和的
形式,若有多种结果时,分行输出结果,例如:
【输入】
10
【输出】
10=3+7
10=5+5
四、30 分
求最大子序列的和,输入一系列的整数,求出该序列中的最大连续子序列的和,并输出该子
序列的首尾位置,例如:
【输入】
1 -3 7 8 -4 12 -10 6
【输出】
23 3 6
void getFibonacci(int n) {
cout << Fibo_Recursive(n);
}
int Fibo_Recursive(int n) {
if (n == 1 || n == 2)return 1;
else return Fibo_Recursive(n - 1) + Fibo_Recursive(n - 2);
}
void drawPic(int row_num, int col_num) {
int cnt = 1,cur_row=0,cur_col=0,sum=row_num*col_num;
int** mat = new int* [row_num];
for (int i = 0; i < row_num; i++)mat[i] = new int[col_num];
for (int i = 0; i < row_num; i++) {
for (int j = 0; j < col_num; j++) {
mat[i][j] = 0;
}
}
while (cnt <= sum) {
while (cur_col < col_num) {
if (cnt > sum || mat[cur_row][cur_col])break;
mat[cur_row][cur_col++] = cnt++;
}
cur_row++;
cur_col--;
while (cur_row < row_num) {
if (cnt > sum || mat[cur_row][cur_col])break;
mat[cur_row++][cur_col] = cnt++;
}
cur_row--;
cur_col--;
while (cur_col >= 0) {
if (cnt > sum || mat[cur_row][cur_col])break;
mat[cur_row][cur_col--] = cnt++;
}
cur_row--;
cur_col++;
while (cur_row >= 0) {
if (cnt > sum || mat[cur_row][cur_col])break;
mat[cur_row--][cur_col] = cnt++;
}
cur_row++;
cur_col++;
}
for (int i = 0; i < row_num; i++) {
for (int j = 0; j < col_num; j++) {
cout << mat[i][j] << " ";
}
if (i < row_num - 1)cout << endl;
}
}
void getMaxSubsequenceSum(int a[], int n,int &maxSum,int &start,int &end) {
typedef struct {
int sum, start, end;
}dp_elem;
dp_elem res_dp;
res_dp.sum = INT32_MIN;
dp_elem* dp = new dp_elem[n];
for (int i = 0; i < n; i++) {
if (i == 0) {
dp[i].sum = a[i];
dp[i].start = 0;
dp[i].end = 0;
}
else {
if (dp[i-1].sum + a[i] > a[i]) {
dp[i].sum = dp[i - 1].sum + a[i];
dp[i].start = dp[i - 1].start;
}
else {
dp[i].sum = a[i];
dp[i].start = i;
}
dp[i].end = i;
}
if (dp[i].sum > res_dp.sum) {
res_dp = dp[i];
}
}
maxSum = res_dp.sum;
start = res_dp.start+1;
end = res_dp.end+1;
}
void decompositeEvenNumber(int n) {
bool primeTable[primeTableSize];//primeTable[i]==True : only when i is a prime (i>0)
memset(primeTable, true, primeTableSize);
for (int i = 2; i < primeTableSize; i++) {
if (primeTable[i]) {
for (int j = 2; i * j < primeTableSize; j++) {
primeTable[i * j] = false;
}
}
}
vector<int>prime;
for (int i = 1; i < primeTableSize; i++) {
if (primeTable[i]) {
prime.push_back(i);
}
}
for (int i = 0; i < prime.size(); i++) {
if (prime[i]>= n)break;
for (int j = i; j < prime.size(); j++) {
if (n == prime[i]+prime[j]) {
cout << n << "=" << prime[i] << "+" << prime[j] << endl;
}
else if (n < prime[i] + prime[j]) {
break;
}
}
}
}