2023.3.17上机练习

  1. 201412-2原题网址
    2023.3.17上机练习_第1张图片
    参照某位大佬的思路(简单易懂)
    思路:每个下标在斜对角线之和都相等,都是2到2n,每次仅仅是扫描方向不同,所以只需要设置一个mark变量就搞定了。
#include 

using namespace std;

const int EAST = 0;
const int SOUTH = 1;
const int SOUTHWEST = 2;
const int NORTHEAST = 3;

struct {
    int drow;
    int dcol;
} direct[] = { {0, 1}, {1, 0}, {1, -1}, {-1, 1} };

const int N = 500;

int a[N][N];

int main()
{
    int n;

    // 输入数据
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];
   
    // Z字形扫描,输出结果
    int row = 0, col = 0, next = EAST;
    cout << a[row][col];
    while (row != n - 1 || col != n - 1) {
        row += direct[next].drow;
        col += direct[next].dcol;
        cout << " " << a[row][col];

        if (next == EAST && row == 0)
            next = SOUTHWEST;
        else if (next == EAST && row == n - 1)
            next = NORTHEAST;
        else if (next == SOUTH && col == 0)
            next = NORTHEAST;
        else if (next == SOUTH && col == n - 1)
            next = SOUTHWEST;
        else if (next == SOUTHWEST && row == n - 1)
            next = EAST;
        else if (next == SOUTHWEST && col == 0)
            next = SOUTH;
        else if (next == NORTHEAST && col == n - 1)
            next = SOUTH;
        else if (next == NORTHEAST && row == 0)
            next = EAST;
    }
    cout << endl;

    return 0;
}

2.问题描述:
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:
第一行是一个整数N,N;接下来由N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:
输出只有一行,即出现次数最多的那个元素值。
输入输出样例

样例输入:
5
100
150
150
200
250

样例输出:
150

#include
#include
using namespace std;
int main()
{
	int n;
	cin >> n;
	int num[21] = { 0 };
	for (int i = 0; i < n; i++)
	{
		cin >> num[i];
	}
	sort(num, num + n);
	int count = 0, max = 0,out=1000000;
	for (int i = 1; i < n; i++)
	{
		if (num[i] == num[i - 1])
		{
			count++;
			if (count > max && num[i] < out)
			{
				max = count;
				out = num[i];
			}
			else
				count = 0;
		}
	}
	cout << out << endl;
	return 0;
}

2023.3.17上机练习_第2张图片

3.题目:
世界杯小组赛(胜得3分,平得1分,负不得分),计算每个队的积分并按排名先后输出,若积分相同,则按净球数排序(保证积分相等时输入的净球数不相等)。输入M个队,出线队N个,输出出线的队的排名、名称、积分、净球数。

输入说明:
名称 胜 平 负 进球数 负球数
2023.3.17上机练习_第3张图片

#include
#include
using namespace std;
struct soccer {
	string c;
	int win;
	int ping;
	int fu;
	int jin;
	int fuqiu;
	int grade;
	int jingqiu;
};
bool comp(soccer a, soccer b)
{
	if (a.grade > b.grade)
		return true;
	else if (a.grade == b.grade && a.jingqiu > b.jingqiu)
		return true;
	else
		return false;
}
int main()
{
	int m, n;
	cin >> m >> n;
	soccer s[20];
	for (int i = 0; i < m; i++)
	{
		cin >> s[i].c >> s[i].win >> s[i].ping >> s[i].fu >> s[i].jin >> s[i].fuqiu;
		s[i].grade = 3 * s[i].win + s[i].ping;
		s[i].jingqiu = s[i].jin - s[i].fuqiu;
	}
	sort(s, s + m,comp);
	for (int i = 0; i < n; i++)
		cout << i + 1 << " " << s[i].c << " " << s[i].grade << " " << s[i].jingqiu << endl;
	return 0;
}

2023.3.17上机练习_第4张图片

4.问题描述:
对于给定的字符序列(字符序列长度小于100),从左至右将所有数字字符取出拼接成一个无符号整数(拼接出的整数小于2^31)。
然后计算并输出该整数的最大因子(如果是素数或0,则其最大因子为自身)。
输入说明:
输入数据为一行字符序列
输出说明:
对输入的字符序列,求出所得整数的最大因子;若字符序列中没有数字或找出的整数为0,则输出0。

输入样例:
样例1输入
sdf0ejg3.f?9f
样例2输入
?4afd0s&2d79*(g
样例3输入
abcde
输出样例:
样例1输出
13
样例2输出
857
样例3输出
0

#include
using namespace std;
bool isprime(int n)
{
	for (int i = 2; i <= sqrt(n); i++)
		if (n % i == 0)
			return false;
	return true;
}
int yinzi(int n)
{
	if (n == 0)
		return 0;
	else if (isprime(n))
		return n;
	else
	{
		int max = 0;
		for (int i = 2; i < n; i++)
		{
			if (n % i == 0 && max < i)
				max = i;
		}
		return max;
	}
}
int main()
{
	char str[100] = { 0 };
	while (gets_s(str))
	{
		int len = strlen(str);
		int num = 0;
		for (int i = 0; i < len; i++)
		{
			if (str[i] >= '0' && str[i] <= '9')
			{
				num = num * 10 + (str[i] - '0');
			}
		}
		cout << yinzi(num) << endl;
	}
	return 0;
}

2023.3.17上机练习_第5张图片

5.问题描述
请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
注:主对角线是方阵从左上角到右下角的一条斜线,辅对角线是方阵从右上角到左下角的一条斜线。
输入说明
输入数据的第一行为一个正整数m;
接下来为m行、每行m个整数表示方阵的元素。
输出说明
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
输入样例
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69
输出样例
159 145 144 135 81 60 44 32 28 27

#include
#include
using namespace std;
bool comp(int a, int b)
{
	if (a > b)
		return true;
	else
		return false;
}
int main()
{
	int m;
	cin >> m;
	int num[20][20] = { 0 };
	for (int i = 0; i < m; i++)
		for (int j = 0; j < m; j++)
			cin >> num[i][j];
	int n[100] = { 0 };
	int k = 0;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			n[k] += num[i][j];
		}
		k++;
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			n[k] += num[j][i];
		}
		k++;
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (i == j)
				n[k] += num[i][j];
		}
	}
	k++;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (i + j == m - 1)
				n[k] += num[i][j];
		}
	}
	sort(n, n + k + 1, comp);
	for (int i = 0; i < k + 1; i++)
		cout << n[i] << " ";
	return 0;
}

2023.3.17上机练习_第6张图片

6.问题描述
请写一个程序,判断给定整数序列能否构成一个等差数列。

输入说明
输入数据由两行构成,第一行只有一个整数n(n < 100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。

输出说明
对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。

输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样![在这里插入图片描述](https://img-blog.csdnimg.cn/bbd7b5b91cd041db9fe77960b743d681.png)

例1输出
no
样例2输出
2

#include
#include
using namespace std;
int main()
{
	int n;
	cin >> n;
	int num[100] = { 0 };
	for (int i = 0; i < n; i++)
		cin >> num[i];
	sort(num, num + n);
	int cha = num[1] - num[0];
	bool flag = true;
	for (int i = 1; i < n; i++)
	{
		if (num[i] - num[i - 1] != cha)
			flag = false;
	}
	if (flag == true)
		cout << cha << endl;
	else
		cout << "no" << endl;
	return 0;
}

2023.3.17上机练习_第7张图片
2023.3.17上机练习_第8张图片

你可能感兴趣的:(c++,算法,图论)