2023.2.23上机练习

暨大上机oj链接点击即可跳转
1.(2019暨大oj)输入一个正整数 N,输出 N 的阶乘。

输入格式
每组数据占一行,包含一个整数 N。

输出格式
每组数据输出占一行,输出 N 的阶乘。

数据范围
1≤N≤10,

输入样例:
4
输出样例:
24
输入样例:
2
输出样例:
2

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int sum = 1;
	for (int i = n; i >=1; i--)
		sum *= i;
	cout << sum << endl;
	return 0;
}

2.(2019暨大oj)给出一个字符串,判断它是不是回文(顺读,逆读均相同)的。

输入格式
数据占一行,包含一个有小写字母构成的字符串。

输出格式
输出一个结果,如果是回文字符串则输出 Yes!,否则输出 No!。

数据范围
字符串长度 ≤ 1000

输入样例:
hellolleh
输出样例
Yes!
输入样例:
helloworld
输出样例
No!

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a;
	cin >> a;
	int len = a.length();
	if (len == 1)
	{
		cout << "Yes!";
	}
	for (int i = 0; i < len / 2; i++)
	{
		if (a[i] != a[len - i - 1])
		{
			cout << "No!";
			break;
		}
		if (i == len / 2-1)
			cout << "Yes!";
	}
	return 0;
}

3.(2019暨大oj)给定长度为n的正整数序列a1,a2,…,an。 求一个递增的子序列,和最大。

输入
第一行,n,表示给定序列的个数。 第二行,n个用空格隔开的正整数。

输出
递增子序列的最大和。

数据范围限制
n ≤ 1000, 0 ≤ ai ≤ 100000。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	int a[10000];
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	if (n == 1)
		cout << a[0];
	else
	{
		int max = 0;
		for (int i = 0; i < n; i++)
		{
			int sum = a[i];
			int k = i;
			for (int j = i + 1; j < n; j++)
			{
				if (a[j] > a[k])
				{
					sum += a[j];
					k = j;
				}
			}
			if (sum > max)
				max=sum;
		}
		cout << max << endl;
	}
	return 0;
}

4.(2018暨大oj)输入一个整数 n ,求斐波那契数列的第 n 项。

假定从 0 开始,第 0 项为 0。

数据范围
0≤n≤39

样例
输入:5
输出:5

#include<iostream>
using namespace std;
int Fib(int n)
{
	if (n == 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

int main()
{
	int n;
	cin >> n;
	cout << Fib(n);
	return 0;
}

5.(2018暨大oj)蛇形矩阵,是由 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
数据范围
n:[1, 15]

#include<iostream>
using namespace std;
int main()
{
	int n, k = 1;
	cin >> n;
	int arr[100][100];
	for (int i = 0; i < n; i++)
	{
		if (i % 2 == 0)
		{
			for (int j = 0; j < n; j++)
			{
				arr[i][j] = k++;
				cout << arr[i][j] << " ";
			}
			cout << endl;
		}
		if (i % 2 == 1) 
		{
			k = n + k;
			for (int j = n; j > 0; j--)
			{
				arr[i][j] = --k;
				cout << arr[i][j] << " ";
			}
			k = n + k;
			cout << endl;
		}
	}
	return 0;
}

6.(2019暨大oj)有一行格子,现在有三种颜料:红,黄,蓝。要每一个格子里面涂一种颜色,相邻格子颜色不能相同,而且首尾格子颜色也不能相同。问有多少种涂法?**

输入格式
一个整数 n,表示格子数量。

输出格式
一个整数 n,表示符合要求的涂法。

数据范围
1 ≤ n ≤ 30

输入样例
1
输出样例
0
输入样例
2
输出样例
6
输入样例
3
输出样例
6

//此题目找规律题
#include<iostream>
#include<math.h>
#include <iomanip>
using namespace std;
int main()
{
	int n;
	cout << setprecision(77);  //不使用科学计数法
	cin >> n;
	if (n == 1)
		cout << '0' << endl;
	else if (n % 2 == 0)
		cout << pow(2, n) + 2 << endl;
	else
		cout << pow(2, n) - 2 << endl;

	return 0;
}

7.(2018暨大oj)任何个偶数总能表示为两个素数之和

输入格式
输入一个偶数 A。

输出格式
输出若干行,每行有两个素数 a b,用空格分开。 且 a+b=A, a ≤ b。

数据范围
A: [4, 1000]

样例输入:
10
样例输出:
3 7
5 5

#include<iostream>
using namespace std;
bool sushu(int n)
{
	if (n == 2)
		return true;
	for (int i = 2; i < n ; i++)
	{
		if (n % i == 0)
			return false;
	}
	return true;
}
int main()
{
	int n;
	cin >> n;
	for (int i = 2; i <= n/2; i++)
	{
		for (int j = 2; j <= n; j++)
		{
			if (sushu(i) && sushu(j) && i + j == n)
				cout << i<<" " << j << endl;
		}
	}
	return 0;
}

8.(2018暨大oj)输入 n 个整数,求出该数组中最大连续子序列的和,并输出该子序列的首尾位置。序列位置从1开始计数。

输入格式说明
第一行:一个整数 n,代表序列中数字个数。 第二行:n 个整数。

输出格式说明
3个整数,分别是最大子序列和,子序列首位置,子序列尾位置。

输入样例
8
1 -3 7 8 -4 12 -10 6
输出样例
23 3 6
数据范围
n:[1, 1000],序列中的元素:[-1000, 1000]。

#include<iostream>
using namespace std;
int main()
{
	int n,arr[1001];
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> arr[i];
	int begin, end;
	int max = -10000;
	for (int i = 1; i <= n; i++)
	{
		int sum = arr[i];
		for (int j = i + 1; j <= n; j++)
		{
			sum += arr[j];
			if (sum > max)
			{
				max = sum; 
				begin = i;
				end = j;
			}
		}
	}
	cout << max << " " << begin << " " << end << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值