2018年暨南大学考研复试上级真题

考试时间 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;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值